简单条件AWK命令



我是一个新的GAWK用户,已经能够找出如何匹配100列报告中多列的模式,但我想学习如何简化代码,而不是附加单个GAWK命令的结果。

我目前的问题是去掉标题信息,再加上各种特定列中"/"字符的所有实例。

这个简化的复合代码示例有效:

gawk -F"|" '$1 ~ "Value" {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt" > c:tempMatches.txt && gawk -F"|" '$8 ~ "/" {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt" >> c:tempMatches.txt && gawk -F"|" '$51 ~ "/" {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt" >> c:tempMatches.txt && gawk -F"|" '$55 ~ "/" {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt" >> c:tempMatches.txt

鉴于我对如何应用AWK表达式和语法的理解有限,简化上述代码(使用来自不同来源的多个示例(的尝试已经完全失败或在某些方面失败。

以下代码挂起:

gawk -F"|" '$1 ~ "Value" || $8 ~ "/" || $51  ~ "/" || $55 ~ "/" {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt"

取消过程后,会产生以下(及类似(错误消息:

'$8'未被识别为内部或外部命令、可操作程序或批处理文件。

下面的代码找到了合适的匹配项,但它包括了我的源数据中的所有100列,而不仅仅是注释中的列:

gawk -F"|" '$1 ~ "Value";$8 ~ "/";$51  ~ "/";$55 ~ "/" {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt" > c:tempMatches.txt

除了任何关于简化上述代码的建议外,哪些GAWK资源或书籍中有最有用的代码示例?

非常感谢您的帮助。

您显然是在Windows CMD上运行,尽管您没有这么说。CMD实现引用的方式与Unix shell不同,尤其是不能以您需要的方式处理单引号' ... '。Windows的C实现,以及基于Unix的C程序的端口,比如对这些实现的笨拙,通常试图尽可能接近Unix外壳命令行处理,但这对这种情况来说是不够的。

如果在支持的Windows(至少8个以上(上,最简单的解决方案是使用PowerShell。(这也是微软推荐的方法FWTW。(PowerShell即使在这里相关的词汇级别上也与Unix有一些显著的差异,尤其是backquote/backtick,但它应该足够接近,可以处理这种情况。(在更高的"cmdlet"级别上,它完全不同,基于结构化数据而非文本。(

另一种解决方案,可以说更具编程性,因此更具本体论性,是使用类似awk的C将布尔值视为整数0和1的事实,并使用算术加法:

gawk -F"|" '($1 ~ "Value")+($8 ~ "/")+($51  ~ "/")+($55 ~ "/") {print $1" | "$8" | "$51" | "$55}' "Q:Report.txt" 

PS:我也会使用OFS,而不是重新键入" | ":

-vOFS=" | " '...{print $1,$8,$51,$55}'

由于您搜索的4列最终也是您所需要的,因此在执行统一的regex:之前,您可以先对行进行预修剪

mawk '(NF =($2=$8 substr(_, $3=$51, $4=$58))^_+3)*/^[^|]*Value||.*//' OFS=' | '
CD_3只是一个占位符结构-它不会破坏$8中包含的数据,而第一半和regex的乘积确保了在打印新的合成行之前,regex必须求值为true

最新更新