あるファイルの内容を繰り返し検索し、別のファイルのキーで置き換えます。

あるファイルの内容を繰り返し検索し、別のファイルのキーで置き換えます。

あるファイルを入力として使用して別のファイルを見つけて置き換える必要があります。次のコマンドはこれを行いますが、各行の最初の列に対してのみ実行されます。すべての列に対してこれが発生するはずです。

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{$1=a[$1];print}' OFS=',' file1 file2 > fileout

2つのファイルは次のとおりです。

ファイル1(キー):

0,name0
1,name1
2,name2
3,name3
4,name4

ファイル2:

23,45,0
41,1,2,4
4,5,22,100
10,20,31,51,1
33,3
16,111,3

出力は次のようになります。

23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3

答え1

これは働きます:

awk -F',' 'NR==FNR{a[$1]=$2} NR>FNR{for (i=1;i<=NF;i++) $i=a[$i];print}' OFS=',' file1 file2 > fileout

ありがとう

答え2

上記の方法では効果がないようです。私のシステムの結果:

,,name0
,name1,name2,name4
name4,,,
,,,,name1
,name3
,,name3

試してみてください

awk -F',' 'NR==FNR{a[$1]=$2; next} {for (i=1;i<=NF;i++) if (a[$i]) $i=a[$i]} 1' OFS=',' file1 file2
23,45,name0
41,name1,name2,name4
name4,5,22,100
10,20,31,51,name1
33,name3
16,111,name3

答え3

これは次の方法で行うこともできますsed

sed -f <(sed 's|,|$/,|;s|^|s/,|;s|$|/|' f1) f2

Kusalanandaが指摘したように、このソリューションはすべての汎用シェルでサポートされていないプロセス置換を使用します。しかし、同じ効果を得る別の方法があります。

どのように動作しますか?基本的な考え方は、ファイルをプログラムf1に変換してsedファイルを変換することですf2。括弧内のコマンドは、sedファイルの各行をコマンドf1に変換しますs///

関連情報