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