$ file1.txt
12345,865221,APPLE,ZZ,QQ,DD,GG,APPLE-FRUIT
12346,865222,MANGO,ZZ,QQ,DD,GG,MANGO-FRUIT
12347,865222,GRAPE,ZZ,QQ,DD,GG,GRAPE-FRUIT
$file2.txt
APPLE-FRUIT,10KG
MANGO-FRUIT,12KG
上記の2つのファイルがあります。以下のように新しいファイルを作成する必要があります。
$Output
12345,865221,APPLE,ZZ,QQ,DD,GG,APPLE-FRUIT,10KG
12346,865222,MANGO,ZZ,QQ,DD,GG,MANGO-FRUIT,12KG
12347,865222,GRAPE,ZZ,QQ,DD,GG,GRAPE-FRUIT
私が見つけた1つの方法は、whileループを使用することです。 file2の各行を読み、最初の列をfile1の列8と比較しました。これにより、目的の出力を得ることができます。同じ目的を達成するために単純なawkコマンドを探しています。
答え1
使用join
:
join -t, -a 1 -1 8 -2 1 file1.txt file2.txt
使用awk
:
最初のファイルの内容を対応するインデックスとして入力して配列に保存し、2番目のファイルを処理するときに呼び出します。
awk -F "," '
FILENAME=="file1.txt"{row[$8]=$0}
FILENAME=="file2.txt"{OFS=","; print row[$1],$2}
' file*.txt
新しい要件の場合:
awk -F "," '
FILENAME=="file1.txt"{row[$8]=$0}
FILENAME=="file2.txt"{row[$1]=row[$1]","$2}
END{ for (i in row) print row[i] }
' file*.txt
になります。ソートの変更。
使用csvsql
:
これも使いやすさです。csvsql
、特にテキストフィールドに引用符が含まれていて、区切り文字が引用符内にある場合、上記の回避策は失敗します。
csvsql -H \
--query "select file1.*, file2.b from file1 left join file2 on file1.h == file2.a" \
file*.txt
答え2
まず、小さなファイルを繰り返します。
awk -F, -v OFS=, '
NR == FNR { weight[$1] = $2; next }
$8 in weight { $(NF+1) = weight[$8] }
1
' file2.txt file1.txt