【问题标题】:How does this awk command works?这个 awk 命令是如何工作的?
【发布时间】:2020-05-25 19:52:48
【问题描述】:

我在文件中有以下数据,并希望将这些行分成两个变量 - 一个具有版本信息,第二个没有版本信息:

3f0e86dd5592                             1969-12-31T19:00:00
0cbf659a22db                             1969-12-31T19:00:00
9dd121133805  1.0.48                     1969-12-31T19:00:00
4daa44734d2e  1.0.45,1.0.47,1.0.42       1969-12-31T19:00:00

如果我在下面运行,我不会得到预期的结果(我认为应该给我没有版本信息的行)。

awk '{ if ($2 == "") { print } }' file.txt 

但在下面运行,给了我没有版本的行:

awk '{ if ($3 == "") { print } }' file.txt 

这是为什么呢?

【问题讨论】:

  • 您是否尝试查找 awk 手册?或浏览其他解释此行为的代码示例?
  • 提示:在好/坏线上,$2 和 $3 的值是多少?
  • awk '{ print $2}' file.txt 1969-12-31T19:00:00 1969-12-31T19:00:00 1.0.48 1.0.45,1.0.47,1.0.42
  • awk '{ print $3}' file1.txt 1969-12-31T19:00:00 1969-12-31T19:00:00
  • 我觉得现在说得通了。如果我错了,请纠正我,在没有版本的行上,将有 $3 空白。从而得到预期的结果。

标签: awk


【解决方案1】:

对于固定宽度的数据,如果您使用 GNU awk,您可以定义每个字段的大小。那么空字段将仅包含空格:

gawk 'BEGIN {FIELDWIDTHS = "14 27 19"} $2 ~ /^[[:space:]]+$/' file
3f0e86dd5592                             1969-12-31T19:00:00
0cbf659a22db                             1969-12-31T19:00:00

【讨论】:

  • 请随时纠正我,我通常相信你的解决方案。
  • 你应该提到需要 GNU awk。
【解决方案2】:

这些行有不同数量的字段。前两行有 2 个字段,接下来的两行各有 3 个字段。使用NF==3 作为条件。 $3=="" 没有意义。

【讨论】:

    【解决方案3】:

    如果我理解您的问题,请使用NF == 2 进行示例,如果您发现任何错误,请随时纠正我

    awk 'NF==2{print}' file
    

    或:

    awk '{if(NF==2) print}' file
    

    输入:

    3f0e86dd5592                             1969-12-31T19:00:00
    0cbf659a22db                             1969-12-31T19:00:00
    9dd121133805  1.0.48                     1969-12-31T19:00:00
    4daa44734d2e  1.0.45,1.0.47,1.0.42       1969-12-31T19:00:00
    

    输出:

    3f0e86dd5592                             1969-12-31T19:00:00
    0cbf659a22db                             1969-12-31T19:00:00
    

    【讨论】:

    • 这是正确的。它可以短至awk 'NF == 2' file,因为默认操作是打印该行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多