複数のファイルの文字列を1つのファイルの各文字列行に置き換えます。

複数のファイルの文字列を1つのファイルの各文字列行に置き換えます。

長年このサイトを使ってきていつも回答があるので質問を一度もしませんでした(通常多くの回答)。私はこれも同じだと確信していますが、生涯にわたってそれを見つけることができません。

任意の長さの行を含むファイルを含むディレクトリがあります。

a.txt
b.txt
c.txt
d.txt

eg.txtその後、文字列のリストを含むファイルがあります。

opq  111
rst  222
uvw  333
xyz  444

各txtファイルには、置き換えたい文字列があります。

a.txt has a#P#b
b.txt has c#P#d
c.txt has e#P#f
d.txt has g#P#h

#P#文字列ファイルの2番目の「列」に置き換えたいと思います。これはファイルごとに一度だけ発生します#P#(私はそこにファイルを入れたからです)。結果は次のとおりです。

a.txt has a111b
b.txt has c222d
c.txt has e333f
d.txt has g444h

「不変」の仮定は、私のディレクトリにある行数だけeg.txtファイルがあり、.txtアルファベット順にソートされているということです。の行は、eg.txt「列」1に基づいてアルファベット順にソートされます。

forループでawkand sed(実際には)を使用してこれを実行しようとしましたが、sd「ソース」と「ターゲット」を1行ずつ読み取ることはできません。

私は結果を取得する方法は難しいことではありません。現在は多くの行やファイル(今は15行と15個のファイル)を扱っていませんが、時にはそのような場合があります。 ArchとDebianベースのLinuxディストリビューション(時にはWSL 2)でzshをシェルとして使用します。

回答がありましたらお詫び申し上げます。私はこのプロジェクトを見つけるために過去2日間で本当に一生懸命働いてきましたが、今は頭が疲れています。

編集:ディレクトリ内のファイルにさまざまな長さの行がたくさんあり、指定された文字列が#P#ファイルごとに1回だけ表示されることを明確にするために更新されました。

ベストアンサー1

GNU awkを使用した「内部」編集ARGIND

awk -i inplace '
    NR == FNR { map[NR]=$2 }
    NR != FNR { sub(/#P#/,map[ARGIND]) }
1' eg.txt ?.txt

上記は、代替テキストにeg.txtスペースや&sが含まれていないと仮定しています。

おすすめ記事