首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用awk读取一行的一部分,包括空格数?

如何使用awk读取一行的一部分,包括空格数?
EN

Stack Overflow用户
提问于 2022-03-22 08:24:29
回答 4查看 295关注 0票数 1

我希望使用"awk subtring“提取一个值,它也应该计算没有任何分隔符的空格数。

例如,下面是输入,我想提取"29611",包括空格,

代码语言:javascript
运行
复制
201903011232101029 2961104E3021  223  0 12113  5  15 8288 298233 0  45  0     39    4  

我使用了这种方法,但它使用空间作为分隔符:

代码语言:javascript
运行
复制
more abbas.dat | awk '{print substr($1,1,16),substr($1,17,25)}'

预期产出应是:

代码语言:javascript
运行
复制
201903011232101029  2961

但它只打印

代码语言:javascript
运行
复制
201903011232101029

我的问题是,我们如何使用"substr“来打印计算空格?

我知道,我可以使用这个命令获得所需的输出,但这对我的目标没有帮助。

代码语言:javascript
运行
复制
more abbas.dat | awk '{print substr($1,1,16),substr($2,1,5)}'
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-03-22 08:37:17

第一种解决方案:和您的示例一起使用,请尝试遵循awk代码。用GNU awk编写和测试。这里使用match函数的awk获得所需的输出。

To打印第一个字段,然后从第二个字段开始使用不同的空格,然后从第二个字段打印5位数字,然后使用以下方法:

代码语言:javascript
运行
复制
awk 'match($0,/^[0-9]+[[:space:]]+[0-9]{5}/){print substr($0,RSTART,RLENGTH)}'  Input_file

在第一个字段中打印16个字母,从第二个字段打印5个字母,包括在第一个字段和第二个字段之间不同长度的空格:

代码语言:javascript
运行
复制
awk 'match($0,/^([0-9]{16})[^[:space:]]+([[:space:]]+)([0-9]{5})/,arr){print arr[1] arr[2] arr[3]}'  Input_file

第二解决方案:使用GNU grep,考虑到您的第2列前4个所需值可以是任何值(例如:数字、字母等),请尝试如下。

代码语言:javascript
运行
复制
grep -oP '^\S+\s+.{5}' Input_file

在第二个字段中只匹配4个数字,在grep上有一个小的变化。

代码语言:javascript
运行
复制
grep -oP '^\S+\s+\d{5}' Input_file
票数 4
EN

Stack Overflow用户

发布于 2022-03-22 08:31:06

如果总是有一个空格,您可以使用以下命令打印第一个组,再加上第二个组的前5个字符。

注:问题中不清楚你想要4个字符还是5个字符,但这很容易调整。

代码语言:javascript
运行
复制
more abbas.dat | awk '{print $1" "substr($2,1,5) }'
票数 1
EN

Stack Overflow用户

发布于 2022-03-22 08:52:33

我认为最简单的方法是在您的命令中包含"Fs“。

代码语言:javascript
运行
复制
more abbas.dat | awk -Fs '{print substr($1,1,16),substr($1,17,25)}'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71568900

复制
相关文章

相似问题

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