というファイルがありますパスの回復.txtこれには他のファイルへのパスが含まれています。
~へパスの回復.txt:
./a2111oi/sky130_fd_sc_hd__a2111oi_0.txt
./a2111oi/sky130_fd_sc_hd__a2111oi_2.txt
./a2111oi/sky130_fd_sc_hd__a2111oi_4.txt
各パスは、以下のように同じ構造を持つ別のテキストファイルを指します。
HEAD
INFO
BEGIN sky130_fd_sc_hd__a2111oi_0
...
...
END BEGIN
END INFO
END HEAD
path_resume.txtから各.txtファイルを読み取ろうとし、それらの間のすべての行をコピーします。スタートそして終わりが始まる出力.txtという別のファイルに増分保存します。
BEGIN sky130_fd_sc_hd__a2111oi_0
...
...
END BEGIN
BEGIN sky130_fd_sc_hd__a2111oi_2
...
...
END BEGIN
BEGIN sky130_fd_sc_hd__a2111oi_4
...
...
END BEGIN
私が実行したとき:
awk '{while((getline a < $0)> 0) print a}' path_resume.txt
path_resume.txtのすべてのファイルを正しく読み取ることができますが、不要な行を削除することはできません。
私が実行したとき:
awk '/BEGIN/{flag=1}/END BEGIN/{flag=0}flag' ./a2111oi/sky130_fd_sc_hd__a2111oi_0.txt
>> output.txt
不要な行を削除できますが、ファイルパスを手動で渡す必要があります。私の目標を達成するためにこれら2つのコマンドをマージする方法がわかりません。助けてくれてありがとう。
ベストアンサー1
ループ内で印刷/印刷しないフラグを使用して同じロジックを構築できますwhile(getline)
。このような:
awk '{ while((getline a < $0) > 0) {
if (a ~ /BEGIN/) p=1;
if (p) print a;
if (a ~ /END BEGIN/) p=0;
} }' path_resume.txt > output.txt
if
ここで唯一のことは、AWKスクリプトの最上位レベルで実行するのと同じように、暗黙の条件の代わりに明示的なステートメントを使用する必要があることです。
あるいは、Bashでファイル名のリストを配列に入れ、一度にAWKに渡します。
readarray -t filenames < path_resume.txt
awk '/BEGIN/ {p=1}; p; /END BEGIN/ {p=0}' "${filenames[@]}" > output.txt
END BEGIN
(終了区切り文字を印刷するために、チェックの前に印刷ジョブを配置しました。)