Awk - 2つのファイル間の値を一致させ、新しいファイルを作成します。

Awk - 2つのファイル間の値を一致させ、新しいファイルを作成します。

両方のファイルにあるデータを使用して、Final.txtファイルを比較して生成するファイルが2つあります。

File1 - 列 1 と File2 - 列 2 には、2 つのファイル間の一致に必要な値が含まれています。

したがって、本質的に私はFile1から列1をインポートしようとしていますが、file2の列2に一致するものがある場合は、File1Column1、File1Column2、およびFile2Column1をfinal.txtという名前の新しいファイルに書き込みます。

はい

ファイル1

1000,Brian
1010,Jason
400,Nick

ファイル2

3044 1000
4466 400
1206 1010

Final.txt ファイルは次のとおりです。

1000,Brian,3044
1010,Jason,1206
400,Nick,4466

私はawkを使ってこれを行うことができなければならないと思いますが、何らかの理由で実行するのは本当に難しいです。どんな助けでも大変感謝します。

ありがとう

ベストアンサー1

1つの方法は次のとおりです。

$ awk -F"[, ]" 'NR==FNR{a[$1]=$1","$2; next} ($2 in a){print a[$2]","$1}' file1 file2 
1000,Brian,3044
400,Nick,4466
1010,Jason,1206

-F"[, ]"フィールド区切り文字をスペースまたはカンマに設定します。FNR現在の行番号とNR現在のファイルの現在の行番号。両方のファイルは、最初のファイルを読み取る場合にのみ同じです。したがって、NR==FNR{a[$1]=$1","$2; next}最初のファイルの行でのみ実行され、最初のフィールドと2番目のフィールド(間にカンマを含む)をaキーが最初のフィールドである配列の値として保存します。次に、2番目のファイルを読み取るときに2番目のフィールドがある場合は、そのa値(最初のファイルの最初と2番目のフィールド)と2番目のファイルの最初のフィールドを印刷します。


さて実際にそんなことをしてくれるアプリがあります!これがまさにこのものjoinが作られた理由です。残念ながら、2つのファイルがソートされておらず、区切り文字が異なるため、いくつかのトリックが必要です。シェルがそれをサポートしている場合は、<()次のことができます。

$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2) 
1000,Brian,3044
1010,Jason,1206
400,Nick,4466

このjoin -t, -1 1 -2 2メソッドは区切り文字として使用され、,file1 の最初のフィールドと file2 の 2 番目のフィールドを連結します。スペースをカンマで置き換えると、両方のファイルsedに同じ区切り文字があります。sortボトルに記載されているように入力を揃えます。

おすすめ記事