如何替换以>开头的行通过awk命令使用同一行的15列?

时间:2012-02-15 15:08:37

标签: linux awk gsub

我的文件看起来像这样:

 >gi|358482566|ref|NW_003766328.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961607, whole genome shotgun sequence
 TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT
 GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT
 ACTAGATTGTA
 >gi|358482565|ref|NW_003766329.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961609, whole genome shotgun sequence
 TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA
 TTTCCATTAGAGGAAAATAAGGTT 

我想用第15列替换所有以>开头的行。我不知道的是如何用一列替换该行,所以我试图将该行的所有列替换为第15列。

所以我期望输出的是:

     >ChrUn_7180000961607
     TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT
     GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT
     ACTAGATTGTA
     >ChrUn_7180000961609
     TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA
     TTTCCATTAGAGGAAAATAAGGTT 

这些是我的命令:

 awk '{if ($1 ~ />/) for (i=1; i<=19; i++) gsub ($i, $15)}'
 test.fa

当我使用它时,我在文件中得到一些更改,但不是我想要的!第15列被删除!!!

 awk '{if ($1 ~ />/) for (i=1; i<=19; i++) a= $15 gsub($i, a)}'
 gga_ref_Gallus_gallus-4.0_unplaced.fa

当我使用这个时,我得到了这个错误!

awk: (FILENAME=gga_ref_Gallus_gallus-4.0_unplaced.fa FNR=1) fatal: sub_common: buf: can't allocate 521711124992 bytes of memory (Cannot allocate memory)

所以我想要的是用第15列替换以 * >开头的行* ll,我还想开头有>

2 个答案:

答案 0 :(得分:2)

我认为这会做你想做的事情:

awk '$0 ~ /^>/ { print ">" $15; next } 1'

它使所有不以>开头的行保持不变。这是通过使用next告诉awk跳转到以>开头的行的情况下的下一条记录来完成的。 1存在,因为它始终为true,因此对于不以>开头的任何行,都会调用打印行的默认操作。

答案 1 :(得分:0)

这可能对您有用:

 sed 's/^\(\s*\)>\(\S*\s*\)\{15\}.*/\1\2/;s/,\s*$//' file