AWK はテキストファイルからパスを読み込みます。

AWK はテキストファイルからパスを読み込みます。

というファイルがありますパスの回復.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(終了区切り文字を印刷するために、チェックの前に印刷ジョブを配置しました。)

おすすめ記事