元のテキスト:
yes
no
approved
declined
2番目のテキスト
1111 1
333 4
1
および4
は元のテキストで置き換えたい行番号です
出力:
1111
no
approved
333
これを処理する方法
短いawkアプローチ:
awk 'NR==FNR{ a[$2]=$1; next }FNR in a{ $0=a[FNR] }1' file2 file1
a[$2]=$1
- 2番目のフィールド$1
値を配列a
インデックスとして使用して1番目のフィールド$2
値をキャプチャする(最初の入力ファイルを処理する場合、つまりfile2
)$0=a[FNR]
-行全体を現在のレコード番号FNR
に関する値に置き換えます(file1
を処理する場合)出力:
1111
no
approved
333
プログラム生成プログラムが好きな場合は、awkを使用してsedスクリプトを作成できます。
awk '{printf "%dc\\\n%s\n", $2, $1}' < second | sed -f - original
sedがスクリプトのstdinを受け入れる場合、または:
awk '{printf "%dc\\\n%s\n", $2, $1}' < second > tempfile &&
sed -f tempfile original &&
rm tempfile
sedがスクリプトのstdinを受け入れない場合。
中間のsedスクリプトは、サンプル入力では次のようになります。
1c\
1111
4c\
333