Mr.*_*ven 2 linux scripting awk text-processing
我有一个名为path_resume.txt的文件,其中包含其他文件的一些路径。
里面path_resume.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
Run Code Online (Sandbox Code Playgroud)
每个路径都指向另一个具有相同结构的文本文件,如下所示:
HEAD
INFO
BEGIN sky130_fd_sc_hd__a2111oi_0
...
...
END BEGIN
END INFO
END HEAD
Run Code Online (Sandbox Code Playgroud)
我试图从 path_resume.txt 读取每个 .txt 文件,复制BEGIN和END BEGIN之间的所有行,并增量保存到另一个名为 output.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
Run Code Online (Sandbox Code Playgroud)
当我跑步时:
awk '{while((getline a < $0)> 0) print a}' path_resume.txt
Run Code Online (Sandbox Code Playgroud)
我可以正确读取 path_resume.txt 中的每个文件,但无法删除不需要的行。
当我跑步时:
awk '/BEGIN/{flag=1}/END BEGIN/{flag=0}flag' ./a2111oi/sky130_fd_sc_hd__a2111oi_0.txt
>> output.txt
Run Code Online (Sandbox Code Playgroud)
我可以删除不需要的行,但是我必须手动传递文件的路径。我不知道如何合并这两个命令来实现我的目标。我很感激任何帮助。
您可以使用循环内的打印/无打印标志构建相同的逻辑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
Run Code Online (Sandbox Code Playgroud)
这里唯一的事情是您需要显式使用if语句,而不是像在 AWK 脚本顶层那样使用隐式条件。
或者在 Bash 中,将文件名列表放入一个数组中,然后将它们一次性全部传递给 AWK:
readarray -t filenames < path_resume.txt
awk '/BEGIN/ {p=1}; p; /END BEGIN/ {p=0}' "${filenames[@]}" > output.txt
Run Code Online (Sandbox Code Playgroud)
(我将打印操作放在END BEGIN检查之前,以打印结束分隔符。)
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |