awk は、2 つのファイルの内容をフィルタリングするために使用されます。

awk は、2 つのファイルの内容をフィルタリングするために使用されます。
$ 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

おすすめ記事