如何在行值

时间:2017-10-10 11:31:32

标签: awk

我想使用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,因为我可以单独执行此操作

希望这是有道理的

干杯 奥利

1 个答案:

答案 0 :(得分:2)

是的,你可以给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