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