web-dev-qa-db-ja.com

元のファイルの行を別のファイルの行番号に置き換えます

元のテキスト:

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
3
RomanPerekhrest

プログラム生成プログラムが好きな場合は、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
0
Jeff Schaller