【问题标题】:Extract values from a fixed-width column从固定宽度的列中提取值
【发布时间】:2017-03-24 22:44:03
【问题描述】:

我有一个名为 file 的文本文件,其中包含以下内容:

Australia              AU 10
New Zealand            NZ  1
...

如果我使用以下命令从第一列中提取国家名称:

awk '{print $1}' file

我得到以下信息:

Australia
New
...

仅输出每个国家名称的第一个单词。

如何获得完整的国家名称?

【问题讨论】:

  • 为你的 awk 尝试这样的事情:awk -F '[\t]+' '{print $1}' 你只需要告诉它字段分隔符是什么。

标签: linux awk


【解决方案1】:

试试这个:

$ awk '{print substr($0,1,15)}' file
Australia
New Zealand

【讨论】:

  • 感谢它只需要摆脱空白即可:
  • awk '{print substr($0,1,22)}' | awk NF
  • @p.Trinx:需要明确一点:您之前评论中的 awk '{print substr($0,1,22)}' file | awk NF 命令不会修剪尾随空格(| awk NF 部分是有效的禁止 -使用您的示例数据进行操作),但此处的其他答案确实显示了如何修剪。
【解决方案2】:

补充Raymond Hettinger's helpful POSIX-compliant answer

您的国家/地区名称列似乎有 23 个字符宽。

在最简单的情况下,如果您不需要修剪尾随空格,您可以使用cut

# Works, but has trailing whitespace.
$ cut -c 1-23 file
Australia              
New Zealand            

警告GNUcut 不支持 UTF-8,因此如果输入是 UTF-8 编码并包含非 ASCII 字符,则上述内容将不能正常工作。


修剪尾随空格,您可以利用 GNU awk 的非标准 FIELDWIDTHS 变量:

# Trailing whitespace is trimmed.
$ awk -v FIELDWIDTHS=23 '{ sub(" +$", "", $1); print $1 }' file
Australia
New Zealand
  • FIELDWIDTHS=23 声明第一个字段(反映在$1)为 23 个字符宽。

  • sub(" +$", "", $1) 然后将字段 ($1) 末尾的任何非空空格 (" +") 替换为空字符串,从而从 $1 中删除尾随空格。

但是,您的 Linux 发行版可能带有 Mawk 而不是 GNU Awk;使用awk -W version 来确定它是哪一个。


对于修剪尾随空格POSIX兼容解决方案,请扩展 Raymond 的答案:

# Trailing whitespace is trimmed.
$ awk '{ c=substr($0, 1, 23); sub(" +$", "", c); print c}' file
Australia
New Zealand

【讨论】:

  • 如果您还需要获取国家代码和尾随数字,您可以指定更多的字段宽度为gawk -v "FIELDWIDTHS=23 2 3" '{...}'
【解决方案3】:

去掉最后两列

awk 'NF>2 && NF-=2' file

NF>2 是过滤超过 2 个字段的记录的守卫。如果您的数据是一致的,您可以简单地将其删除,

awk 'NF-=2' file

【讨论】:

    【解决方案4】:

    这在您的数据有空格的情况下无关紧要,但通常没有:

    $ docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
    foo            bar       baz       etc...
    

    在这些情况下,使用tr 删除多个空格很容易得到,比如IMAGE 列:

    $ docker ps | tr --squeeze-repeats ' '
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    foo bar baz
    

    现在您可以将它(没有讨厌的标题行)通过管道传输到cut

    $ docker ps | tr --squeeze-repeats ' ' | tail -n +2 | cut -d ' ' -f 2
    foo
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      • 2015-01-07
      • 2011-02-24
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多