awkでは、繰り返し性に基づいて値を一致させ、合計を印刷します。

awkでは、繰り返し性に基づいて値を一致させ、合計を印刷します。

次のCSVファイルがあります。

ファイル1

19997,20161108,FSM,EXCHANGE_2,GLOBE,0  
17541,20161108,TATA_MOBILE,WORLD,TELECOM,1  
34556,20161108,europe,state,0  

ファイル2

EXCHANGE_2,CANADA,30298  
WORLD,INDIA,1123  
state,canada,2241  

ファイル1の列4をファイル2の列1と一致させて、これら2つのファイルを結合する新しいファイルをどのように作成しますか?結果は次のとおりです。

19997,20161108,FSM,EXCHANGE_2,GLOBE,0,CANADA,30298
17541,20161108,TATA_MOBILE,WORLD,TELECOM,1,INDIA,1123
34556,20161108,europe,state,0,canada,2241

答え1

共通フィールドを介して2つのファイルを結合することは、joinこのコマンドの一般的な作業です。 awk以外のものと答えることができるようにしてください。bashコードは次のとおりです。

join -t, -1 4 -2 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,2.3 <(sort -t, -k4 file1.csv) <(sort -t, -k1 file2.csv)

答え2

どうですか?

awk -F, 'NR==FNR {l[$4]=$0 ; next} {print l[$1]","$2","$3}' file1 file2

NR==FNR {l[$4]=$0 ; next}最初のファイルを読み取ると、最初のブロックがアクティブになり、l4番目のフィールドをキーとして使用して、行全体を名前付き連想配列に配置します。next次の説明はその行をスキップします。

2番目のブロックは2番目のファイルを読み取るときにのみ{print l[$1]","$2","$3}アクティブになり、file2の最初の列で指定されたキーを使用してfile1内の保存行全体を照会します。次に、ファイル2の2つのカンマと$ 2と$ 3のフィールドで印刷します。

関連情報