【问题标题】:awk, print lines which start with four digitsawk,打印以四位数字开头的行
【发布时间】:2013-04-29 14:45:32
【问题描述】:

我想打印文件中所有以四位数字开头的行。我试过这个 allredy 但它不起作用:

cat data.txt | awk --posix '{ if ($1 ~ /^[0-9]{4}/) print $1}'

没有产生输出

下一行打印所有以数字开头的行:

cat data.txt | awk --posix '{ if ($1 ~ /^[0-9]/) print $1}'

【问题讨论】:

  • useless use of cat 的另一个示例。
  • 打印所有匹配的行还是打印所有匹配的行的第一个字段?
  • Awk 本质上是一种模式/动作语言; understanding patterns 是一项基本技能。 Regular expressions 是一种模式。您可能应该在这里使用 grep 代替,但无论如何都要学习 awk 的模式/动作。
  • @MikeSherrill'Catcall':实际上你不需要awk 也不需要grep。在bash也可以轻松解决。

标签: awk


【解决方案1】:

使用 awk:

$ awk '/^[0-9][0-9][0-9][0-9]/ {print $1}' your_file

即检查行首的 4 位数字。

更新:第 5 个字符不是数字。

$ awk '/^[0-9][0-9][0-9][0-9]([^0-9].*)?$/ {print $1}' your_file

请注意,不必使用{ if ($1 ~ /^[0-9]/) 语句,只需使用/^.../

【讨论】:

  • 谢谢你这已经有点帮助了。我忘了提到我需要从四位数开始。您的解决方案在开头也显示 >4 位数字。
  • 您可能仍需要考虑恰好包含四位数字的行的角落情况; /^[0-9][0-9][0-9][0-9]([^0-9].*)$/...
【解决方案2】:

对于打印与给定正则表达式匹配的行,grep 是第一个抓取的工具:

grep -Eo '^[0-9]{4}[^0-9]*\s' file

【讨论】:

    【解决方案3】:

    我看不到问题。

    awk --posix '{ if ($1 ~ /^[0-9]{4}/) print $1}'<<EOT
    1234 qwer
    234 asdf
    34456 qwe
    EOT
    

    得到

    1234
    34456
    

    果然……

    如果您需要精确匹配四位数字,那么您可以使用:

    awk --posix '$1~/^[0-9]{4}$/{print $1}'<<EOT
    1234 qwer
    234 asdf
    34456 qwe
    EOT
    

    输出:

    1234
    

    但实际上你不需要运行awk,如果你在bash

    while read f rest; do
      [[ $f =~ ^[[:digit:]]{4}$ ]] && echo $f
    done <<EOT
    1234 qwer
    234 asdf
    34456 qwe
    EOT
    

    输出:

    1234
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2016-09-01
      • 2014-01-15
      • 2012-01-09
      • 1970-01-01
      相关资源
      最近更新 更多