【问题标题】:How to loop awk command over row values如何在行值上循环 awk 命令
【发布时间】:2017-10-10 11:31:31
【问题描述】:

我想使用 awk 在表格的第一列中搜索特定单词并在第 6 列中打印该值。我了解如何使用以下内容一次搜索一个单词:

awk '$1 == "<insert-word>" { print $6 }' file.txt

但我想知道是否可以在连续的单词列表中循环?

例如,如果我在下面有一个类似 file1.txt 的表格:

cat file1.txt 
dna1    dna4    dna5
dna3    dna6    dna2
dna7    dna8    dna9

我可以遍历第 1 行中的每个值并在下面的 file2.txt 的第 1 列中搜索这个词,每次打印第 6 列的值吗?然后对第 2 行、第 3 行等执行此操作...

cat file2
dna1    0   229 7   0   4   0   0
dna2    0   296 39  2   1   3   100
dna3    0   255 15  0   6   0   0
dna4    0   209 3   0   0   0   0
dna5    0   253 14  2   3   7   100
dna6    0   897 629 7   8   1   100
dna7    0   214 4   0   9   0   0
dna8    0   255 15  0   2   0   0
dna9    0   606 338 8   3   1   100

因此,在文件 1 的第 1 行上循环 awk 的示例将返回数字 4、0 和 3。

在第 2 行上循环命令将返回数字 6、8 和 1

最后遍历第 3 行将返回数字 9、2、3

一个示例输出可能是

4    0    3
6    8    1
9    2    3

我真正想要的是对每行返回的数字的总值求和。我只是不确定这是否可能......

这个例子的输出是

7
15
14

但如果使用 awk 无法执行此步骤,我并不担心,因为我可以单独执行此步骤

希望这是有道理的

干杯 奥利

【问题讨论】:

  • 请在您的帖子中也发布示例输出。
  • 是的,也许这是一个不好的例子,因为我刚刚给出了两个大文件的头部并且两者之间没有任何匹配。但是,如果 file1 的第 1 行例如包含 TRINITY_DN100001_c0_g1_i1 和 TRINITY_DN100004_c0_g1_i1 我希望 file2 的第 6 列是 0.00 和 0.21
  • 我已将原始评论更改为更有用的示例
  • 抱歉 Ed,这次我放了一个示例输出。谢谢
  • 好的,但是您发布了 2 个不同的可能输出。只需选择您想要的输出并发布即可。

标签: awk


【解决方案1】:

是的,你可以给 awk 多个输入文件。以您为例:

awk 'NR==FNR{a[$1]=a[$2]=1;next}a[$1]{print $6}' file1 file2

我没有测试上面的单线,但它应该可以。至少你明白了。

如果你不知道你的文件1中有多少列,正如你所说,你想做一个循环:

awk 'NR==FNR{for(x=1;x<=NF;x++)a[$x]=1;next}a[$1]{print $6}' file1 file2

更新

编辑新要求:

awk 'NR==FNR{a[$1]=$6;next}{for(i=1;i<=NF;i++)s+=a[$i];print s;s=0}' f2 f1

上述单行输出:(以 f1 和 f2 作为输入示例 file1 file2):

7
15
14

【讨论】:

  • 感谢您的建议,尽管我尝试此操作时没有得到任何输出
  • @OllieWhite 然后做一些小的输入示例,也请提供所需的输出。
  • 感谢您的建议,我现在在原始评论上放了一个更简单的示例
  • @OllieWhite 你能在代码块中添加期望输出吗?
  • 我现在放了一个例子,谢谢你的建议
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2015-08-17
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多