長年このサイトを使ってきていつも回答があるので質問を一度もしませんでした(通常多くの回答)。私はこれも同じだと確信していますが、生涯にわたってそれを見つけることができません。
任意の長さの行を含むファイルを含むディレクトリがあります。
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ループでawk
and 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が含まれていないと仮定しています。