【问题标题】:Problems combining awk scripts结合 awk 脚本的问题
【发布时间】:2015-07-13 11:05:42
【问题描述】:

我正在尝试使用 awk 来解析制表符分隔的表——第一列中有几个重复的条目,我需要删除表中其他 4 列的总和较小的重复行。我可以轻松删除第一行或第二行,并对列求和,但我无法将两者结合起来。出于我的目的,不会有超过 2 个重复项。

示例文件:http://pastebin.com/u2GBnm2D

在这种情况下,所需的输出是删除行:

lmo0330 1       1       0       1
lmo0506 7       21      2       10

并在列中保持其他两行具有相同的基因 id。最终解析的文件如下所示:http://pastebin.com/WgDkm5ui

这是我尝试过的(这没有任何作用。但第一部分删除了第二个重复项,第二部分对计数求和):

awk 'BEGIN {!a[$1]++} {for(i=1;i<=NF;i++) t+=$i; print t; t=0}'

我尝试在此问题的最佳答案中修改脚本的第二部分:Removing lines containing a unique first field with awk?

awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile

但不幸的是,我并不真正了解发生了什么足以使其正常工作。谁能帮我吗?我想我需要将a[$1] &gt; 1 部分替换为[删除(第一次重复计数或第二次重复计数,具体取决于哪个更大)。

编辑:如果重要的话,我也在使用 GNU Awk 3.1.7。

【问题讨论】:

  • 你的问题没问题,但很难理解,你到底想要什么。
  • 我添加了一个链接,指向解析后输出的样子,这有助于澄清问题吗?
  • 这是一个非常旧的 gawk 版本,你应该更新它,因为你缺少很多非常有用的功能。

标签: linux bash awk


【解决方案1】:

你可以使用这个awk 命令:

awk 'NR == 1 {
   print;
   next
} {
   s = $2+$3+$4+$5
} s >= sum[$1] {
   sum[$1] = s;
   if (!($1 in rows))
      a[++n] = $1;
   rows[$1] = $0
} END {
   for(i=1; i<=n; i++)
      print rows[a[i]]
}' file | column -t

输出:

gene     SRR034450.out.rpkm_0  SRR034451.out.rpkm_0  SRR034452.out.rpkm_0  SRR034453.out.rpkm_0
lmo0001  160                   323                   533                   293
lmo0002  135                   317                   504                   306
lmo0003  1                     4                     5                     3
lmo0004  35                    59                    58                    48
lmo0005  113                   218                   257                   187
lmo0006  279                   519                   653                   539
lmo0007  563                   1053                  1165                  1069
lmo0008  34                    84                    203                   107
lmo0009  13                    45                    90                    49
lmo0010  57                    210                   237                   169
lmo0011  65                    224                   247                   179
lmo0012  65                    226                   250                   215
lmo0013  342                   500                   738                   682
lmo0014  662                   1032                  1283                  1311
lmo0015  321                   413                   631                   637
lmo0016  175                   253                   273                   325
lmo0017  3                     6                     6                     6
lmo0018  33                    38                    46                    45
lmo0019  13                    1                     39                    1
lmo0020  3                     12                    28                    15
lmo0021  3                     4                     14                    12
lmo0022  2                     3                     5                     1
lmo0023  2                     0                     3                     2
lmo0024  1                     0                     2                     6
lmo0330  1                     1                     1                     3
lmo0506  151                   232                   60                    204

【讨论】:

  • 谢谢!我明天运行它
  • 从未见过像这样的缩进/格式 - 剪切/粘贴问题?
  • Welp...这不能按预期工作。这是我的完整文件:pastebin.com/hPnBw8RU 和运行 awk 脚本的输出文件:pastebin.com/6ghVFVDK ... 不知何故,它删除了不重复的基因名称,我不知道为什么:/在这个例子中只有 3 个重复.
  • 啊,没错。我们需要s &gt;= sum[$1] 而不是s &gt; sum[$1]。查看更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
相关资源
最近更新 更多