Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Awk只打印(0,1)if模式,但我想打印该模式_Bash_Unix_Awk_Pattern Matching - Fatal编程技术网

Bash Awk只打印(0,1)if模式,但我想打印该模式

Bash Awk只打印(0,1)if模式,但我想打印该模式,bash,unix,awk,pattern-matching,Bash,Unix,Awk,Pattern Matching,我是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 34

我是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
提前感谢大家

您可以尝试:

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
}
开始{
pat=“Pattern\\w+”
}
{
对于(i=1;i你可以说:

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
分配给模式匹配的结果。)


您可能还想参考。

awk'{a=$1;for(i=1;i其他答案介绍了如何实现您的目标。让我解释一下您的脚本无法工作的原因。
如果行与模式匹配,表达式
/Pattern\w+/
将返回
1
(true),而
0
(false)则返回其他wize

所以这个表达:

{print $1, $2 = /Pattern\w+/}
多少相当于

{
  test = /Pattern\w+/;
  print $1, test  
}

+1但是您应该提到,解决方案是特定于gawk的,这是POSIX
[:alnum:]
的gawk速记。对我来说,似乎比使用两个单独的动作块显示的更自然的语法是单个动作块
awk'{match($0,/Pattern\w+/);print$1,substr($0,RSTART,RLENGTH)}'文件
,但这两种方式都可以。
{
  test = /Pattern\w+/;
  print $1, test  
}