在特定列中搜索模式并输出整行

Kit*_*man 8 grep sed awk text-processing

我在 HDFS 中工作,并试图获取第 4 列以数字 5 开头的整行:

100|20151010|K|5001
695|20151010|K|1010
309|20151010|R|5005
410|20151010|K|5001
107|20151010|K|1062
652|20151010|K|5001
Run Code Online (Sandbox Code Playgroud)

因此应该输出:

100|20151010|K|5001
309|20151010|R|5005
410|20151010|K|5001
652|20151010|K|5001
Run Code Online (Sandbox Code Playgroud)

ter*_*don 8

最简单的方法可能是awk

awk -F'|' '$4~/^5/' file
Run Code Online (Sandbox Code Playgroud)

-F'|'设置字段分隔符|。该$4~/^5/如果第四场开始会是真的5awk当某项评估为 true 时的默认操作是打印当前行,因此上面的脚本将打印您想要的内容。

其他选择是:

  • 珀尔

    perl -F'\|' -ane 'print if $F[3]=~/^5/' file
    
    Run Code Online (Sandbox Code Playgroud)

    同样的想法。所述-a开关使perl上由给定的值分割其输入字段-F到阵列@F。然后我们打印数组的第 4 个元素(字段)(数组从 0 开始计数)是否以 a 开头5

  • grep

    grep -E  '^([^|]*\|){3}5' file 
    
    Run Code Online (Sandbox Code Playgroud)

    正则表达式将匹配一串 non-|后跟|3 次,然后是5.

  • GNU 或 BSD sed

    sed -En '/([^|]*\|){3}5/p' file 
    
    Run Code Online (Sandbox Code Playgroud)

    -E上扩展正则表达式匝数和-n禁止常规输出。正则表达式与grep上述相同,p最后sed只打印与正则表达式匹配的行。


mik*_*erv 2

这将打印所有匹配的行|5,然后不再打印|,直到行尾:

grep '|5[^|]*$' <in >out
Run Code Online (Sandbox Code Playgroud)