5

我正在尝试通过 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 

但结果是打印了 file2 中的所有行,因此数组检查不起作用。你能找出我的错误吗?

4

1 回答 1

12

这个单线应该做你想做的事:

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

你的问题是,你有 var f,这是一个数字,我猜它是列的索引。

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

也就是说,如果你给了f=22,对于 file2 中的每一行,你检查数组中的常量 22。所以输出要么是 file2 中的所有行,要么是 file2 中的标题,这取决于你的 file1 中的常量 22。:)

于 2013-08-01T12:31:34.233 回答