両方のファイルにあるデータを使用して、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
ボトルに記載されているように入力を揃えます。