我有几个文件格式如下
some text
some text
This section is for WXYZ
some text
some text
some text
some text
some text
some text (ABC) some text (CDF)
901 98
some text FFG
some text (FFG)
1 99
some text
some text
我正在尝试打印每个文件
- 文件名
- 同一行中“This section is for”后面的字符串
- 包含以下字符串的行
(ABC)
- 包含以下字符串的行
(FFG)
这是我当前的脚本(基于此线程中的答案)
awk '/This section is for/{sub(/This section is for /,""); print FILENAME "|" $0}
a{print;a=0} /\(ABC\)/{a=1}
b{print;b=0} /\(FFG\)/{b=1}
' "testfile.txt"
我得到了这个输出
testfile.txt|WXYZ
901 98
1 99
我希望每个文件的输出都是一行,像这样
testfile.txt|WXYZ|901 98|1 99
如何修改脚本以实现我的目标?谢谢
像这样,使用
printf "%s"
以避免换行符:每当我有包含标签值对的输入时,我发现首先构建这些映射的数组(
f[]
如下)以将值的检测与值的使用分开很有用,然后我可以以任何顺序和任何我喜欢的组合来打印,比较,修改,只需用它们的标签(名称)对数组进行索引即可。例如,使用任何 awk:
|
请注意,即使输入文件中缺少任何标签,这也将始终为您提供 4 个分隔的输出字段。既然你说过:
如果你想一次处理所有输入文件,你可以使用 GNU awk 来执行此操作:
或者使用任何 awk:
GNU
AWK
确实为 的内容添加了输出行分隔符print
,默认情况下为换行符 (\n
),您可以通过设置其他ORS
值来更改它,在这种特殊情况下,让testfile.txt
内容为然后
将给予
观察
|
末尾是否有换行符,这个问题可以通过以下方式修复给出输出
解释:我在两行的第一行
ORS
之后更改为换行符print
,与哪一行(a
或b
)在前无关。如果您想了解有关 ORS 的更多信息,请阅读8 个强大的 Awk 内置变量 - FS、OFS、RS、ORS、NR、NF、FILENAME、FNR(在 GNU Awk 5.3.1 中测试)