繁体   English   中英

从固定宽度的列中提取值

[英]Extract values from a fixed-width column

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

Australia              AU 10
New Zealand            NZ  1
...

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

awk '{print $1}' file

我得到以下信息:

Australia
New
...

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

我怎样才能得到整个国家的名字?

尝试这个:

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

摆脱最后两列

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

NF>2是过滤具有2个以上字段的记录的保护。 如果您的数据一致,您可以简单地将其删除

awk 'NF-=2' file

为了补充Raymond Hettinger有用的POSIX兼容答案

您的country-name列看起来像是23个字符宽。

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

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

警告GNU cut不支持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

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

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM