首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从固定宽度列中提取值。

从固定宽度列中提取值。
EN

Stack Overflow用户
提问于 2017-03-24 22:44:03
回答 4查看 5K关注 0票数 4

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

代码语言:javascript
复制
Australia              AU 10
New Zealand            NZ  1
...

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

代码语言:javascript
复制
awk '{print $1}' file

我得到以下信息:

代码语言:javascript
复制
Australia
New
...

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

我怎么才能知道整个国家的名字?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-24 23:23:33

试试这个:

代码语言:javascript
复制
$ awk '{print substr($0,1,15)}' file
Australia
New Zealand
票数 3
EN

Stack Overflow用户

发布于 2017-03-25 01:59:55

补充Raymond Hettinger's helpful POSIX-compliant answer

看上去你的国名列有23个字符宽。

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

代码语言:javascript
复制
# Works, but has trailing whitespace.
$ cut -c 1-23 file
Australia              
New Zealand            

警告: GNU cut不知道UTF-8,所以如果输入是UTF-8编码的,并且包含非ASCII字符,那么上面的输入将不能正常工作。

要使用awk's剪裁尾随空格,可以利用GNU非标准FIELDWIDTHS变量:

代码语言:javascript
复制
# Trailing whitespace is trimmed.
$ awk -v FIELDWIDTHS=23 '{ sub(" +$", "", $1); print $1 }' file
Australia
New Zealand
  • FIELDWIDTHS=23声明第一个字段(反映在$1中)宽23个字符。
  • 然后,sub(" +$", "", $1)$1中删除尾随空格,将字段末尾的任何非空空格(" +")替换为空字符串。

但是,您的Linux发行版可能是Mawk而不是GNU;使用awk -W version来确定它是哪一个。

对于POSIX-compliant解决方案,trims尾随空格,请扩展雷蒙德的答案:

代码语言:javascript
复制
# Trailing whitespace is trimmed.
$ awk '{ c=substr($0, 1, 23); sub(" +$", "", c); print c}' file
Australia
New Zealand
票数 3
EN

Stack Overflow用户

发布于 2017-03-25 02:18:06

去掉最后两列

代码语言:javascript
复制
awk 'NF>2 && NF-=2' file

NF>2是用于过滤超过2个字段的记录的保护程序。如果你的数据是一致的,你可以简单地把它删除,

代码语言:javascript
复制
awk 'NF-=2' file
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43010319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档