linux 从固定宽度列中提取值

1aaf6o9v  于 2022-11-02  发布在  Linux
关注(0)|答案(4)|浏览(147)

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

Australia              AU 10
New Zealand            NZ  1
...

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

awk '{print $1}' file

我得到以下结果:

Australia
New
...

仅输出每个国家/地区名称的第一个单词。
如何获得整个国家的名称?

ekqde3dh

ekqde3dh1#

试试看:

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

anauzrmj2#

若要补足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字符,上述操作将无法正常工作。

修剪尾随空格,您可以利用**GNUawk**的非标准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
bfnvny8b

bfnvny8b3#

去掉最后两列

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

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

awk 'NF-=2' file
yduiuuwa

yduiuuwa4#

这与数据中包含空格的情况无关,但通常情况下,数据中不包含空格:

$ 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

相关问题