5

awk で 2 つの個別のファイルを読み取り、2 番目のファイルを出力ファイルに解析しようとしています。

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 です)。

1日苦労した後、私は次のことを思いつきました:

#!/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

あなたの問題は、f数値である var があることです。これは列のインデックスだと思います。

しかし、コードをチェックするf場合、 を値として使用した場合は、fをチェックする代わりに配列内にあるかどうかをチェックします$f

つまり、 を指定した場合f=22、file2 の各行に対して、配列内の定数 22 がチェックされます。したがって、出力は file2 のすべての行または file2 のヘッダーのみのいずれかになります。これは、file1 の定数 22 によって異なります。:)

于 2013-08-01T12:31:34.233 に答える