如何使用 awk 读取包含 space 个数的行的一部分?

how to use awk to read a part of line including number of space?

我想使用“awk subtring”提取一个值,它还应该计算没有任何分隔符的 space 的数量。

例如下面是输入,我要提取“29611”,包括space、

201903011232101029 2961104E3021  223  0 12113  5  15 8288 298233 0  45  0     39    4  

我用的是这个方法,但是用了space作为分隔符:

more abbas.dat | awk '{print substr(,1,16),substr(,17,25)}'

预期输出应为:

201903011232101029  2961

但它只打印

201903011232101029

我的问题是我们如何使用计数 spaces 的“substr”进行打印?

我知道,我可以使用此命令获得所需的输出,但它对我的 objective

没有帮助
more abbas.dat | awk '{print substr(,1,16),substr(,1,5)}'

如果总有一个 space 您可以使用以下命令打印第一组,加上第二组的前 5 个字符。
N.B。问题中不清楚您是想要 4 个字符还是 5 个字符,但可以轻松调整。

more abbas.dat | awk '{print " "substr(,1,5) }'

第一个解决方案: 使用您显示的示例,请尝试遵循 awk 代码。用 GNU awk 编写和测试。在此处使用 awkmatch 函数来获得所需的输出。

To 打印第一个字段,然后是不同的空格,然后是第二个字段的 5 位数字,然后使用以下内容:

awk 'match([=10=],/^[0-9]+[[:space:]]+[0-9]{5}/){print substr([=10=],RSTART,RLENGTH)}'  Input_file

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

awk 'match([=11=],/^([0-9]{16})[^[:space:]]+([[:space:]]+)([0-9]{5})/,arr){print arr[1] arr[2] arr[3]}'  Input_file


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

grep -oP '^\S+\s+.{5}' Input_file

OR 仅匹配第 2 个字段中的 4 个数字在上面 grep.[=20= 中有一个小的变化]

grep -oP '^\S+\s+\d{5}' Input_file

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

more abbas.dat | awk -Fs '{print substr(,1,16),substr(,17,25)}'
$ awk '{print substr([=10=],1,24)}' file
201903011232101029 29611

如果这不是您所需要的全部,请编辑您的问题以阐明您的要求。