2017-04-13 4 views
0

もう一度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{,} 

、コミュニティが提供できるすべてのヘルプは大歓迎ですが、私は上記のプログラムが行う考えを説明しよう。

  1. 最初の行は、区切り文字と出力区切り文字をタブ文字に設定します。
  2. この行は、最初のファイルを読み取り、項目がリストに表示された回数をカウントした配列を格納します。
  3. これは本質的にヘッダーで、行の最後の項目の最後に "DUPLICATE"を追加して出力します
  4. これは現在の値が配列 " a "は、格納された値が1より大きいかどうかをチェックする必要があります。 「はい」の場合は、最後の列に「DUPE」と表示されます。最後に、行全体を返します。

テストファイルでは、すべて「DUPE」とマークされているか、何も表示されません。

私はファイルを結合してそのようにすることも考えましたが、それは最初のファイルからの望ましくない残存値を残してしまいます。

私は間違っていますか?

+0

私のデューデリジェンスを行うなどを研究し、私はこのスニペットを見つけました。 '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

答えて

2

あなたが間違っていることは、あなたの現在の問題とは関係のない一連のスクリプトを出発点として使用しようとしていると思います。あなたが必要とするすべてがあるよう

ですね:

$ awk ' 
NR==FNR { file1[$1]; next } 
FNR==1 || !($1 in file1) 
' file1 file2 
fruit number rand 
potato 234 2342 
grapes 9 572 422 
+1

ありがとうEd Morton!これはまさに私がしたいことです。あなたは正しい、私は手でデータを入力していたし、 "大根"は出力の一部であってはならない。これがどのように機能するのか理解してもらえますか? – mikelcal

+0

あなたが使用しているスクリプトよりもはるかに簡単です - どのように動作すると思いますか?私は質問にお答えできます... –

+1

私はそれを撃つ – mikelcal

関連する問題