6

ファイルを使用して別のファイルをフィルタリングする awk を手伝ってください。メインファイルがあります。

...
17,466971 0,095185 17,562156 id 676
17,466971 0,096694 17,563665 id 677
17,466971 0,09816 17,565131 id 678
17,466971 0,099625 17,566596 id 679
17,466971 0,101091 17,568062 id 680
17,466971 0,016175 17,483146 id 681
17,466971 0,101793 17,568764 id 682
17,466971 0,10253 17,569501 id 683
38,166772 0,08125 38,248022 id 1572
38,166772 0,082545 38,249317 id 1573
38,233772 0,005457 38,239229 id 1574
38,233772 0,082113 38,315885 id 1575
38,299771 0,081412 38,381183 id 1576
38,299771 0,006282 38,306053 id 1577
38,299771 0,083627 38,383398 id 1578
38,299771 0,085093 38,384864 id 1579
38,299771 0,008682 38,308453 id 1580
38,299771 0,085094 38,384865 id 1581
...

この他のファイル、最後の列 (id) に基づいていくつかの行を抑制/削除したい:

...
d 17.483146 1 0 udp 181 ------- 1 19.0 2.0 681
d 38.239229 1 0 udp 571 ------- 1 19.0 2.0 1574
d 38.306053 1 0 udp 1000 ------- 1 19.0 2.0 1577
d 38.308453 1 0 udp 1000 ------- 1 19.0 2.0 1580
d 38.372207 1 0 udp 546 ------- 1 19.0 2.0 1582
d 38.441845 1 0 udp 499 ------- 1 19.0 2.0 1585
d 38.505262 1 0 udp 616 ------- 1 19.0 2.0 1586
d 38.572324 1 0 udp 695 ------- 1 19.0 2.0 1588
d 38.639246 1 0 udp 597 ------- 1 19.0 2.0 1590
d 38.639758 1 0 udp 640 ------- 1 19.0 2.0 1591 
...

上記の例の場合、結果は次のようになります。

17,466971 0,095185 17,562156 id 676
17,466971 0,096694 17,563665 id 677
17,466971 0,09816 17,565131 id 678
17,466971 0,099625 17,566596 id 679
17,466971 0,016175 17,483146 id 680
17,466971 0,101793 17,568764 id 682
17,466971 0,10253 17,569501 id 683
38,166772 0,08125 38,248022 id 1572
38,166772 0,082545 38,249317 id 1573
38,233772 0,082113 38,315885 id 1575
38,299771 0,081412 38,381183 id 1576
38,299771 0,083627 38,383398 id 1578
38,299771 0,085093 38,384864 id 1579
38,299771 0,085094 38,384865 id 1581

削除された行は次のとおりです。

17,466971 0,101091 17,568062 id 681
38,233772 0,005457 38,239229 id 1574
38,299771 0,006282 38,306053 id 1577
38,299771 0,008682 38,308453 id 1580

これを自動化するために awk を使用するコマンドはありますか?

前もって感謝します

4

1 に答える 1

21

使用する1つの方法は次のawkとおりです。

awk 'FNR==NR { a[$NF]; next } !($NF in a)' other main

結果:

17,466971 0,095185 17,562156 id 676
17,466971 0,096694 17,563665 id 677
17,466971 0,09816 17,565131 id 678
17,466971 0,099625 17,566596 id 679
17,466971 0,101091 17,568062 id 680
17,466971 0,101793 17,568764 id 682
17,466971 0,10253 17,569501 id 683
38,166772 0,08125 38,248022 id 1572
38,166772 0,082545 38,249317 id 1573
38,233772 0,082113 38,315885 id 1575
38,299771 0,081412 38,381183 id 1576
38,299771 0,083627 38,383398 id 1578
38,299771 0,085093 38,384864 id 1579
38,299771 0,085094 38,384865 id 1581

感嘆符をドロップして、「削除された」行を表示します。

awk 'FNR==NR { a[$NF]; next } $NF in a' other main

結果:

17,466971 0,016175 17,483146 id 681
38,233772 0,005457 38,239229 id 1574
38,299771 0,006282 38,306053 id 1577
38,299771 0,008682 38,308453 id 1580

または、2つのファイルが必要な場合は、1つは値'present'を含み、もう1つは値'deleted'を含みます。

awk 'FNR==NR { a[$NF]; next } { print > ($NF in a ? "deleted" : "present") }' other main

説明1:

FNR==NR { ... }は、引数リストの最初のファイルに対してのみtrueを返す一般的に使用される構造です。この場合、awk最初にファイル'other'を読み取ります。このファイルが処理されているとき、最後の列($NF)の値が配列(これを)に追加しaます。nextその後、残りのコードの処理をスキップします。最初のファイルが読み取られると、FNRはに等しくなくなりますNR。したがって、awk「許可」されてブロックをスキップFNR--NR { ... }し、引数リストの2番目のファイル「main」に適用される残りのコードの処理を開始します。たとえば、が配列にない!($NF in a)場合、は行を出力しません。$NF

説明2:

どの列に関しては、これが役立つ場合があります。

$1         # the first column
$2         # the second column
$3         # the third column

$NF        # the last column
$(NF-1)    # the second last column
$(NF-2)    # the third last column
于 2012-12-27T23:20:07.793 に答える