Awk:检查值是否不在数组中

6

我正在尝试用awk读取两个不同的文件,并将第二个文件解析到输出文件中。

file1包含数字:

1
2
5
7
10

file2 包含一个头部(字段数量小于 3)和列中的数据值(25 列)

_rlnNrOfSignificantSamples #24 
_rlnMaxValueProbDistribution #25 
300.000000 25425.970703 25000.669922     6.050000     2.000000    56.000000     0.277790     79096.000000     0.100000 000001@Particles/Micrographs/006_particles.mrcs   453.000000   604.000000     1.000000     0.859382 Micrographs/006.mrc            1    -3.469177     -3.469177     0.000000     0.000000   -82.345885           23  9475.876495            1     0.988689
300.000000 25425.970703 25000.669922     6.050000     2.000000    56.000000     0.277790 79096.000000     0.100000 000002@Particles/Micrographs/006_particles.mrcs   431.000000   428.000000     1.000000     0.806442 Micrographs/006.mrc            1    -1.469177    -3.469177     0.000000     0.000000    87.654115           22  9412.959278            1     1.000000

我希望从file1中读取数字并存入数组,然后:
  1. 打印file2的标题
  2. 如果字段$22的值不在数组中,则打印file2的行(在之前的示例中,其值为23和22)
经过一天的努力,我想出了以下解决方案:
#!/bin/bash    
FieldNum=22

awk -v f=$FieldNum 'FNR==NR{num[$1]; next}
    {
        # print the header of file2
        if(NF < 3) {print > "output"}
        # check lines after header  
        else {if (f in num) {} else {print >> "output"}}
    }' $file1 $file2 

但实际上打印了文件2中的所有行,因此数组检查不起作用。能否请您找出我的错误?
1个回答

13

这个一行代码应该可以满足你的需求:

 awk 'NR==FNR{a[$0];next}NF<3||!($22 in a)' file1 file2

你遇到的问题是,你有一个名为f的变量,它是一个数字,我猜它是列的索引。

但是如果你检查你的代码,你使用f作为一个值来检查数组中是否存在f,而不是检查$f

也就是说,如果你给出f=22,对于file2中的每一行,你都会检查常数22是否在数组中。因此输出将是file2中的所有行或仅文件头,这取决于常数22是否在你的file1中。 :)


非常感谢!我忘记了默认情况下 awk 检查数组中是否存在特定的索引而不是搜索值。 - user2641718

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接