次の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}
最初のファイルを読み取ると、最初のブロックがアクティブになり、l
4番目のフィールドをキーとして使用して、行全体を名前付き連想配列に配置します。next
次の説明はその行をスキップします。
2番目のブロックは2番目のファイルを読み取るときにのみ{print l[$1]","$2","$3}
アクティブになり、file2の最初の列で指定されたキーを使用してfile1内の保存行全体を照会します。次に、ファイル2の2つのカンマと$ 2と$ 3のフィールドで印刷します。