从固定宽度列中提取值

时间:2017-03-24 22:44:03

标签: linux awk

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

Australia              AU 10
New Zealand            NZ  1
...

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

awk '{print $1}' file

我得到以下内容:

Australia
New
...

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

如何获取整个国家/地区名称?

3 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:1)

摆脱最后两列

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

NF>2是过滤具有2个以上字段的记录的守护者。如果您的数据是一致的,您可以将其简化为

awk 'NF-=2' file

答案 2 :(得分:0)

补充Raymond Hettinger's helpful POSIX-compliant answer

您的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 的非标准{{1}变量:

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

  • $1然后通过替换字段末尾(sub(" +$", "", $1))的任何非空间空格($1)来删除" +"中的尾随空格空字符串。

但是,你的Linux发行版可能会附带Mawk而不是GNU Awk;使用$1来确定它是哪一个。

对于修剪尾随空格符合POSIX标准的解决方案,请延伸Raymond的答案:

awk -W version