2012-02-15 51 views
0

我有文件,它看起来像这样:如何用awk命令替换以同一行的第15列开始的行?

>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) 

所以我想要的是二取代* LL与 * >15列启动线,我想还是在开始>

+0

你在乎那是第15场的一部分逗号?即使他们是该领域的一部分,您也不会在示例输出中显示他们。 – 2012-02-15 15:19:47

+0

这不是管道分离的数据吗?如果你在谈论领域,你需要一个不同的领域分隔符。另外,使用perl这样做会不会更容易? – tchrist 2012-02-15 15:22:07

+0

@tchrist如果您查看数据,它似乎是以空格分隔的字段;最初我也感到困惑。在awk中看到它是微不足道的,我无法想象在perl中它会变得更容易。 – 2012-02-15 15:30:55

回答

2

我认为这会做你想要什么:

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

它的叶子是不>不变开头的所有行。这是通过使用next来告诉awk跳到>开始的行的情况下的下一个记录。 1在那里,因为它始终为真,所以打印行的默认行为是针对任何不以>开头的行调用的。

+0

你能告诉我什么剂量1吗? – mahmood 2012-02-15 15:29:14

+0

@mahmood编辑成答案。如果不够清楚,请告诉我。 – 2012-02-15 15:33:35

+0

@mahmood而不是'1',你可以有一个规则说'{print}' - 更多的字符,但更清晰。 – 2012-02-15 16:50:03

0

这可能会为你工作:

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