![](/img/trans.png)
[英]Using Awk to process a file where each record has different fixed-width fields
[英]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.