ファイルのパターンをリストのパターンに1行ずつ繰り返し置き換えます。

ファイルのパターンをリストのパターンに1行ずつ繰り返し置き換えます。

私は以下を試しています:

/dir1/textfile
/dir2/textfile
/dir3/textfile

「textfile」は常に同じ内容、つまり単純な数字(400)を持ちます。

これで、数値が異なるデータファイルがあります。各値は新しい行にあります(したがって、1行に1つずつ)。

私が望むのは、「textfile」(400)の値をデータファイルの値に置き換えることです。ただし、数値は私のデータファイルのエントリと一致する必要があります。

datafile
14
25
335

14次のように書く必要があります。dir1/textfile

25次のように書く必要があります。dir2/textfile

335次のように書く必要があります。dir3/textfile

など...

私は遊んでいましたsedが、これまでの解決策は見つかりませんでした。どんなアイデアがありますか?

ベストアンサー1

そしてawk

awk '{print $0 > "dir"NR"/textfile"}' datafile
  • NR現在のレコード番号に展開されるため、各行はに保存されます。dir<line_number>/textfileたとえば、最初の行はに保存され、dir1/textfile2番目の行はに保存されますdir2/textfile

whileファイルラインの高価な屋根ふきは不要で、次のことを行います。

i=1; while IFS= read -r line; do echo "$line" >dir"$i"/textfile; ((i++)); done <datafile

上記のシェル方式は単なるデモ方式に過ぎないので、誰もが従う必要がありますawk


コメントに基づいて編集:

400すべてのsを希望の数字に置き換えるには、次の手順を実行しますdatafile

i=1; while IFS= read -r line; do sed "s/400/$line/g" dir"$i"/textfile; ((i++)); done <datafile

ファイルを適切に編集するには、次の手順を実行します。

i=1; while IFS= read -r line; do sed -i "s/400/$line/g" dir"$i"/textfile; ((i++)); done <datafile

バックアップソースファイル.bak拡張子:

i=1; while IFS= read -r line; do sed -i.bak "s/400/$line/g" dir"$i"/textfile; ((i++)); done <datafile

おすすめ記事