如何使用 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
编写和测试。在此处使用 awk
的 match
函数来获得所需的输出。
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
如果这不是您所需要的全部,请编辑您的问题以阐明您的要求。
我想使用“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
编写和测试。在此处使用 awk
的 match
函数来获得所需的输出。
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
如果这不是您所需要的全部,请编辑您的问题以阐明您的要求。