我是AWK的新手,我觉得很棒,但我是个菜鸟。
我这样做:
awk '{print $1, $2 = /Pattern\w+/}' file
这种数据:
3145 wfgd4 2345 sdf 55667 PatternAHF34
3148 fh345 34f PatternRT4555 NNN NNN
3158 57ggt 3458f 58886 PatternYT334 56YY
3165 rf3d4 2t45 sdf 55667 Potato
3188 fhrf5 34b PatternRT8855 N3 NN55
3218 g7ggt 34ggf 5116 PatternYYY34 56YT
如您所见,列未对齐。
我想要的是什么:
3145 PatternAHF34
3148 PatternRT4555
3158 PatternYT334
3165
3188 PatternRT8855
3218 PatternYYY34
我得到了什么:
3145 1
3148 1
3158 1
3165 0
3188 1
3218 1
提前感谢大家
答案 0 :(得分:5)
你可以说:
awk '{match($0, /Pattern\w+/)} { print $1, substr($0, RSTART, RLENGTH) }' file
为了您的输入,它会产生:
3145 PatternAHF34
3148 PatternRT4555
3158 PatternYT334
3165
3188 PatternRT8855
3218 PatternYYY34
(您的示例生成0
和1
,因为您将$2
分配给模式匹配的结果。)
您可能还想引用Built-in variables。
答案 1 :(得分:2)
您可以尝试:
awk -f f.awk file
其中f.awk
是:
BEGIN {
pat="Pattern\\w+"
}
{
for (i=1; i<=NF; i++) {
if ($i ~ pat) {
print $1, $i
next
}
}
print $1
}
答案 2 :(得分:1)
awk '{a=$1;for(i=1;i<=NF;i++){if ($i~/Pattern/){a=a " " $i}};print a}'
阅读方法如下。对于每一行,抓住第一个字段,然后遍历该行的所有字段,如果找到匹配的字段,也抓住它,然后打印你已经得到的任何字段..
答案 3 :(得分:1)
其他答案介绍了如何实现自己想要的目标。让我解释一下为什么你的脚本不起作用
如果行匹配模式并且/Pattern\w+/
(false)otherwize,则表达式1
将返回0
(true)。
所以表达式:
{print $1, $2 = /Pattern\w+/}
或多或少等同于
{
test = /Pattern\w+/;
print $1, test
}