2016-12-05 4 views
0

私は2つのcsvファイルを持っています。ファイル1には9861行と4列があり、ファイル2には6037行と5列があります。ここにファイルがあります。2つのcsvファイルを比較し、識別子として最初の3つの列を使用して共通線を印刷します

Link of File 1

Link of File 2

最初の3つの列は、それぞれ年、月、日です。

私はここにいくつかの記事からこのコマンドを見つけましたが、これだけの作品が識別子として1列を使用して3

をファイルに、このファイル1とプリントで同じ識別子とファイルの2の行を取得したい:

awk -F, 'NR==FNR {a[$1]=$0;next}; $1 in a {print a[$1]; print}' file1 file2 

私は識別子として最初の3つの列を使用することができるawkまたはより簡単なコマンドを使用してこれを行う方法がありますか?

何か助けていただければ幸いです。

+0

次回は、簡潔でテスト可能なサンプル入力と予想される出力を持つ[mcve]が含まれています。詳細については[ask]を参照してください。大きなファイルへのリンクは通常役に立ちませんし、多くの人がそれらをクリックすることもありません - あなたの例をファイルごとに約半ダースの行(つまり、**最小**)まで下げてください。人々はもっと喜んで見ていきます入力がほとんどの要件のあいまいさを解消すると想定される場合には、期待される出力を含めます。 –

+1

@エドモートン。ヒントの多くのありがとう。私はこれを念頭に置いておきます。 – ichabod

答えて

1
awk -F, '{k=$1 FS $2 FS $3} NR==FNR{a[k];next} k in a' file1 file2 

もちろん未テストにアクセスします。

2

ちょうどあなたが必要な一意性を作るために複数の列を使用します。

$ awk -F, 'NR==FNR {a[$1, $2, $3] = $0; next} 
      $1 SUBSEP $2 SUBSEP $3 in a' file1 file2 

SUBSEP は添字の区切りです。デフォルト値 "\ 034"を持ち、多次元配列のインデックスの部分を区切るために使用されます。あなたが任意のサンプル入力/出力を提供しなかったので、このように、表現foo["A", "B"]は本当にfoo["A\034B"]

+0

一致した出力をfile2からのみ分離する方法はありますか? – ichabod

+0

多くのおかげです。できます! – ichabod

+0

問題ありません。助けてくれてありがとう。 – ichabod

関連する問題