解析.txt文件中的文本

时间:2019-07-04 13:57:59

标签: parsing awk

我有一个选项卡式的日志文件,但是我只需要在开始时标记为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个电容器包含前导零和一个数字,我需要该数字

3 个答案:

答案 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]

如果可以准确地捕获您的需求,则awksubstrmatchlength字符串函数的组合可以隔离您感兴趣的数字。例如:

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 /'