2017-05-30 70 views
0

我有一個文件(而不是製表符分隔)如何在bash中爲所有帶有特定字符串的單詞添加一個數字?

chr22 bed2gff . 16850754 16850929  1000 . . .; 
chr22 bed2gff . 17556275 17556923  864 . . .; 
chr22 bed2gff . 17558078 17558342  642 . . .; 
chr22 bed2gff . 17558390 17558813  941 . . .; 
chr22 bed2gff . 17558918 17559181  698 . . .; 
chr22 bed2gff . 17565343 17566824  542 . . .; 
chr22 bed2gff . 17565448 17565617  603 . . .; 

我要的文件是在這樣的方式:

chr22 bed2gff1 . 16850754 16850929  1000 . . .; 
chr22 bed2gff2 . 17556275 17556923  864 . . .; 
chr22 bed2gff3 . 17558078 17558342  642 . . .; 
chr22 bed2gff4 . 17558390 17558813  941 . . .; 
chr22 bed2gff5 . 17558918 17559181  698 . . .; 
chr22 bed2gff6 . 17565343 17566824  542 . . .; 
chr22 bed2gff7 . 17565448 17565617  603 . . .; 

使「bed2gff」是每一行

獨特

我仍然是bash的初學者,使用awk和sed時遇到了很多問題,有沒有一種簡單的方法可以做到這一點?

回答

0
awk -v postvar=1 '{$2=$2 postvar; postvar++}1' input 

這裏,postvar是被初始分配值1。裏面awk執行塊的變量,第二列合併postvar然後的postvar值遞增。

或者使用awk另一種方法:

awk -v postvar=1 '{gsub($2,"&"postvar,$2);postvar++}1' inputfile 

這裏,gsub功能用於將計數器添加到第二列。

PS:您可以使用OFS="\t"來更改輸出格式。

+2

只是增加了這一點,你可以否定的需要來初始化和使用NR備案號,而不是等使用postvar變量:AWK「{$ 2 = $ 2 NR} 1」 –

+0

你也可以只執行'$ 2 = $ 2 postvar ++',而不是賦值,然後是一個單獨的增量。 – 123

0

使用Perl腳本,這很容易解決。讓你試試下面的代碼:

#!/usr/bin/perl 

$^I=".bak"; 
$,="\t"; 
my $i=0; 
while(<>) 
{ 
    $i++; 
    s/(bed2gff)/\1$i/; 
    print; 
} 

請downvoting之前得到清除..

+0

在正則表達式的末尾添加空格使其可以重新運行,但不是必需的。我喜歡perl。 –

+0

哦,那很好。我沒有注意到它。雖然我可以幫你,我想。 – Harini

+0

我有疑問,那麼它需要被空格替換嗎? – Harini

0

猛砸救援。笑

[[email protected] ~]# /bin/cp -f back.dat dat.txt ; bash test.sh dat.txt; cat dat.txt 
complete 6 
chr22 bed2gff1 . 16850754 16850929  1000 . . .; 
chr22 bed2gff2 . 17556275 17556923  864 . . .; 
chr22 bed2gff3 . 17558078 17558342  642 . . .; 
chr22 bed2gff4 . 17558390 17558813  941 . . .; 
chr22 bed2gff5 . 17558918 17559181  698 . . .; 
[[email protected] ~]# cat test.sh 
#!/bin/bash 
i=1; 
lc=$(cat $1 | wc -l) 
while reptext="bed2gff$i" && [ "$lc" -ge "$i" ] && sed -i "0,/bed2gff /s/bed2gff /$reptext /1" $1 && ((i++)); do :; done; 
[[email protected] ~]# 
相關問題