【问题标题】:How to replace lines that start with > with the 15 column of the same line by awk command?如何通过awk命令将以>开头的行替换为同一行的第15列?
【发布时间】:2012-02-15 15:08:36
【问题描述】:

我有如下文件:

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

所以我想要的是两个替换*所有以* &gt;开头的行与第15列,我还想有@ 987654328@开头

【问题讨论】:

  • 你关心第 15 个字段的逗号吗?您不会在示例输出中显示它们,即使它们是该字段的一部分。
  • 这不是管道分隔的数据吗?如果您在谈论字段,则需要不同的字段分隔符。另外,使用 perl 会不会容易很多?
  • @tchrist 如果您查看数据,它似乎是空格分隔的字段;一开始我也很困惑。看到它在 awk 中是微不足道的,我无法想象它在 perl 中会容易得多。
  • @MichaelJ.Barber for 循环让我觉得在 perl 中比在 awk 中更容易,因为 perl 在不需要的地方有更高级的正则表达式,但我看到了毕竟实际上并不需要。

标签: linux awk gsub


【解决方案1】:

我认为这会做你想要的:

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

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

【讨论】:

  • 你能告诉我 1 的剂量是多少吗??
  • @mahmood 编辑为答案。如果还不够清楚,请告诉我。
  • @mahmood 而不是1,你可以有一条规则说{print} - 更多字符但更清晰。
【解决方案2】:

这可能对你有用:

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

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 2018-07-10
    • 2021-11-12
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多