打印多个字段的多个模式匹配
问题描述:
我有一个逗号分隔的文件象下面打印多个字段的多个模式匹配
0,category=a,type=b,value=1
1,category=c,type=b,.....,original_value=0
2,category=b,type=c,....,original_value=1,....,corrected_value=3
文件中的一个行可以包含 (1)仅“值” (2)只有“original_value” ( 3)'原始值'和'corrected_value'
这些值可以在任何列中。
我写的以下awk命令只能在模式匹配后打印一个字段。
cat file | awk -F, 'BEGIN{OFS=","} /value/ { for (x=1;x<=NF;x++) if ($x~"value") {print $2,$3,$(x)} }' | sort -u
电流输出:
category=a,type=b,value=1
category=b,type=c,corrected_value=3
category=b,type=c,original_value=1
category=c,type=b,original_value=0
如何打印如果两个模式匹配发生线路的两个字段(列)?在这种情况下,如果original_value和corrected_value都存在。
期望输出:
category=a,type=b,value=1
category=b,type=c,original_value=1,corrected_value=3
category=c,type=b,original_value=0
猛砸版本:4.3.11
答
您可以使用此命令awk
:
awk 'BEGIN{FS=OFS=","} {printf "%s%s%s", $2,OFS,$3; for(i=4; i<=NF; i++)
if ($i ~ /value/) printf "%s%s", OFS,$i; print ""}' file
category=a,type=b,value=1
category=c,type=b,original_value=0
category=b,type=c,original_value=1,corrected_value=3
答
类似@ anubhava的回答,但不依赖在特定列中的类别或类型:
awk -F, '
BEGIN { pattern = "^(category|type|value|original_value|corrected_value)" }
{
sep = ""
for (i=1; i<=NF; i++) {
if ($i ~ pattern) {
printf "%s%s", sep, $i
sep = ","
}
}
print ""
}
' file