我有一个选项卡式的日志文件,但是我只需要在开始时标记为30.10的那几行即可。
使用命令 awk'/^30.10/{print}'FOOD_ORDERS_201907041307.DEL
我得到这个输出 30.1006 35470015000205910002019070420190705 00000014870000000034
30.1006 35470015000205900002019070420190705 00000014890000000029
30.1006 35470023000205920002019070420190705 00000014900000000011
我需要提取的是3547,以及从零开始到最后的第n个电容器。 因此,预期输出将是: 3547 34 29 11 但是,如果最后10个电容器包含前导零和一个数字,我需要该数字
答案 0 :(得分:1)
这是一个简单的awk
脚本来完成任务:
script.awk
/^30.10/ { # for each line starting with 30.10
last2chars = substr($3, length($3)-1); # extract last 2 chars from 3rd field into variable last2chars
if($3 ~ /00001143$/) last2chars = 1143; # if 3rd field ends with 1143, update variable last2chars respectively
print last2chars; # output variable last2chars
}
input.txt
30.1006 35470015000205910002019070420190705 00000014870000000034
30.1006 35470015000205900002019070420190705 00000014890000001143
30.1006 35470015000205900002019070420190705 00000014890000000029
30.1006 35470023000205920002019070420190705 00000014900000000011
运行:
awk -f script.awk input.txt
输出:
34
1143
29
11
答案 1 :(得分:1)
虽然您的问题不清楚,但是您对埃德·莫顿(Ed Morton)评论的回答使您想达到的目标更加清晰。仍然不清楚的地方正是您要从第三字段中获得的。根据您的问题和各种注释,如果该行以30.10
开头,那么您需要第二个字段的第一个4-digits
,而您想要第三个字段的最右边的数字是[1-9]
。
如果可以准确地捕获您的需求,则awk
与substr
,match
和length
字符串函数的组合可以隔离您感兴趣的数字。例如:
awk '/^30.10/ {
l=match ($3, /[1-9]+$/)
print substr ($2, 1, 4) " " substr ($3, l, length($3)-l+1)
}' test
将采用输入文件(从Dudi Boy的答案中借用),例如
$ cat test
30.1006 35470015000205910002019070420190705 00000014870000000034
30.1006 35470015000205900002019070420190705 00000014890000001143
30.1006 35470015000205900002019070420190705 00000014890000000029
30.1006 35470023000205920002019070420190705 00000014900000000011
并返回给您:
3547 34
3547 1143
3547 29
3547 11
让我知道是否可以准确地捕获您的需求。
答案 2 :(得分:-2)
有一部分! awk'/^30.10/{print}'FOOD_ORDERS_201907041307.DEL | sed's /.*(..)/ \ 1 /'