もう一度awk
質問があります。awkを使用して複数のファイルにまたがる同じ列値のすべてのインスタンスを削除します
私はお互いに重複したいデータを含む複数の大きなファイルを持っています。私はこのデータを受信
fruit number rand
apple 12 342
taco 19 264
tortilla 2234 53423
tortillas 2 3431
apricot 13221 23424
apricots 24234 3252
pineapple 2342 2342
radish 1 3
次の月: は、私は1ヶ月間、以下のデータを持っていると言うことができます
fruit number rand
pineapple 2 698
apple 34 472
taco 19 234
tortilla 16 58
tortillas 87 25
potato 234 2342
radish 1 55
grapes 9 572 422
apricot 13221 24
私は第二のファイルを取り、値を確認されてやろうとしています最初の列の項目が存在するかどうかを確認します。はいの場合は、2番目のファイルから削除し、2番目のファイルに固有の項目だけを1番目のファイルとの関連で残したいとします。
望ましい結果は次のように私に何かを残して:または、より明確に
fruit number rand DUPLICATE
pineapple 2 698 DUPE
apple 34 472 DUPE
taco 19 234 DUPE
tortilla 16 58 DUPE
tortillas 87 25 DUPE
potato 234 2342
radish 1 55 DUPE
grapes 9 572 422
apricot 13221 24 DUPE
を:
fruit number rand
potato 234 2342
grapes 9 572 422
私はファイルをソートすることなく、これを行う方法を考えるしようとしていました。私はの@karafkaから答えを修正しようとしていました。同じファイルを2回渡すのではなく、2つの異なるファイルを入力しようとしました。明らかに私は何か間違っている。
私はまだのawkを学んでいるawk 'BEGIN { FS = OFS = " " }
NR==FNR {a[$1]++; next}
FNR==1 {print $0, "DUPLICATE"; next}
$1 in a{if (a[$1]>1){print $(NF+1)="DUPE";delete a[$1]}}1' file{,}
、コミュニティが提供できるすべてのヘルプは大歓迎ですが、私は上記のプログラムが行う考えを説明しよう。
- 最初の行は、区切り文字と出力区切り文字をタブ文字に設定します。
- この行は、最初のファイルを読み取り、項目がリストに表示された回数をカウントした配列を格納します。
- これは本質的にヘッダーで、行の最後の項目の最後に "DUPLICATE"を追加して出力します
- これは現在の値が配列 " a "は、格納された値が1より大きいかどうかをチェックする必要があります。 「はい」の場合は、最後の列に「DUPE」と表示されます。最後に、行全体を返します。
テストファイルでは、すべて「DUPE」とマークされているか、何も表示されません。
私はファイルを結合してそのようにすることも考えましたが、それは最初のファイルからの望ましくない残存値を残してしまいます。
私は間違っていますか?
私のデューデリジェンスを行うなどを研究し、私はこのスニペットを見つけました。 'awk -F、 ' !見[$ 2] ++ { ライン[$ 2] = $ 0 } END {(見にヴァル) ため IF(見[ヴァル] == 1) 印刷ライン[ヴァル] }から」file' [類似の質問](http://stackoverflow.com/questions/22308082/remove-all-lines-from-file-with-duplicate-value-in-field-including-the-first-oc?rq=1)。これが私の目標に近づくなら、私は更新します。 – mikelcal