我有一个名为file的文本文件,其中包含以下内容:
file
Australia AU 10 New Zealand NZ 1 ...
如果我使用以下命令从第一列中提取国家/地区名称:
awk '{print $1}' file
我得到以下结果:
Australia New ...
仅输出每个国家/地区名称的第一个单词。如何获得整个国家的名称?
ekqde3dh1#
试试看:
$ awk '{print substr($0,1,15)}' file Australia New Zealand
anauzrmj2#
若要补足Raymond Hettinger's helpful POSIX-compliant answer:您的国家/地区名称列的宽度似乎为23个字符。在最简单的情况下,如果您不需要修剪尾随空格,则可以使用cut:
cut
# Works, but has trailing whitespace. $ cut -c 1-23 file Australia New Zealand
警告:GNUcut不支持UTF-8,因此如果输入是UTF-8编码并且包含非ASCII字符,上述操作将无法正常工作。
要修剪尾随空格,您可以利用**GNUawk**的非标准FIELDWIDTHS变量:
awk
FIELDWIDTHS
# Trailing whitespace is trimmed. $ awk -v FIELDWIDTHS=23 '{ sub(" +$", "", $1); print $1 }' file Australia New Zealand
FIELDWIDTHS=23
$1
sub(" +$", "", $1)
" +"
然而,您的Linux发行版可能附带Mawk而不是GNU Awk;请使用awk -W version来确定是哪一个。对于POSIX兼容解决方案(修剪尾随空格),请扩展Raymond的答案:
awk -W version
# Trailing whitespace is trimmed. $ awk '{ c=substr($0, 1, 23); sub(" +$", "", c); print c}' file Australia New Zealand
bfnvny8b3#
去掉最后两列
awk 'NF>2 && NF-=2' file
NF>2是筛选具有两个以上字段的记录的保护。如果您的数据是一致的,您可以将其删除以简单地,
NF>2
awk 'NF-=2' file
yduiuuwa4#
这与数据中包含空格的情况无关,但通常情况下,数据中不包含空格:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES foo bar baz etc...
在这些情况下,使用tr删除多个空格,可以很容易地得到IMAGE列:
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
4条答案
按热度按时间ekqde3dh1#
试试看:
anauzrmj2#
若要补足Raymond Hettinger's helpful POSIX-compliant answer:
您的国家/地区名称列的宽度似乎为23个字符。
在最简单的情况下,如果您不需要修剪尾随空格,则可以使用
cut
:警告:GNU
cut
不支持UTF-8,因此如果输入是UTF-8编码并且包含非ASCII字符,上述操作将无法正常工作。要修剪尾随空格,您可以利用**GNU
awk
**的非标准FIELDWIDTHS
变量:FIELDWIDTHS=23
声明第一个字段(反映在$1
中)为23个字符宽。sub(" +$", "", $1)
会将字段($1
)结尾处的任何非空白空格(" +"
)取代为空字串,以移除$1
的结尾空白。然而,您的Linux发行版可能附带Mawk而不是GNU Awk;请使用
awk -W version
来确定是哪一个。对于POSIX兼容解决方案(修剪尾随空格),请扩展Raymond的答案:
bfnvny8b3#
去掉最后两列
NF>2
是筛选具有两个以上字段的记录的保护。如果您的数据是一致的,您可以将其删除以简单地,yduiuuwa4#
这与数据中包含空格的情况无关,但通常情况下,数据中不包含空格:
在这些情况下,使用
tr
删除多个空格,可以很容易地得到IMAGE
列:现在,您可以通过管道将它(没有讨厌的标题行)传输到
cut
: