Parsing 使用awk检查一行中的多个位置的数据

Parsing 使用awk检查一行中的多个位置的数据,parsing,awk,dynamic,Parsing,Awk,Dynamic,我试图提取一些最初来自大型机的信息。这些行都只是ASCII字符数据,但每行都被视为多段,因此具有不同的行长度。字段以长度分隔。行中有一个字段,指示变量部分所需的行段数。我想做的是在这些变量段中查找指示器的存在,并从中提取一些数据 下面是一个简化的例子 UUID12345 1 ABC 1 345 UUID23456 2 XYZ 4 763 ABC 4 678 UUID34567 3 XYZ 4 763 ABC 2 456 QRS 2 456 UUID45678 2 DE

我试图提取一些最初来自大型机的信息。这些行都只是ASCII字符数据,但每行都被视为多段,因此具有不同的行长度。字段以长度分隔。行中有一个字段,指示变量部分所需的行段数。我想做的是在这些变量段中查找指示器的存在,并从中提取一些数据

下面是一个简化的例子

UUID12345 1   ABC 1 345  
UUID23456 2   XYZ 4 763 ABC 4 678  
UUID34567 3   XYZ 4 763 ABC 2 456 QRS 2 456  
UUID45678 2   DEF 1 345 TUV 8 111 
UUID56789 0
第二列指示了预期的段数。最多可以有99个片段,但实际上,只有不到10个片段。在上面的示例中,每个段将包含10个字节,例如从第一行的ABC位置开始。我要提取的是每行的第一列和包含ABC的任何段的最后3个字符的值

因此,上述行的示例输出可能是:

UUID12345 345  
UUID23456 678  
UUID34567 456
UUID45678 
UUID56789 
我知道一些非常基本的awk,可以寻找一条线的特定部分,但不知道如何实现我需要的。例如,以下内容为我提供了提取第一行的能力,但仅通过查看特定位置,而不考虑指示可变段数的第二列

awk '{ if (substr($0, 0, 4)=="UUID" && substr($0, 15, 3)=="ABC") {print substr($0, 0, 9) " " substr ($0, 21,3)}}' <<< "UUID12345 1   ABC 1 345"
awk'{if(substr($0,0,4)=“UUID”和&substr($0,15,3)=“ABC”){print substr($0,0,9)”“substr($0,21,3)}{code>$awk'{val=”“;for(i=3;i
$awk'{val=”“;for(i=3;iawk的另一种方式:

awk -F'ABC' '{split($1,a," |\t");split($2,b," |\t");print a[1],b[3]}' infile
awk的另一种方式:

awk -F'ABC' '{split($1,a," |\t");split($2,b," |\t");print a[1],b[3]}' infile
使用Perl

$ perl -lane ' ($x)=$_=~/\bABC\s+\S+\s+(\S+)/; print $F[0], " ", $x ' moose.txt
UUID12345 345
UUID23456 678
UUID34567 456
UUID45678
UUID56789

$ cat moose.txt
UUID12345 1   ABC 1 345
UUID23456 2   XYZ 4 763 ABC 4 678
UUID34567 3   XYZ 4 763 ABC 2 456 QRS 2 456
UUID45678 2   DEF 1 345 TUV 8 111
UUID56789 0

$
使用Perl

$ perl -lane ' ($x)=$_=~/\bABC\s+\S+\s+(\S+)/; print $F[0], " ", $x ' moose.txt
UUID12345 345
UUID23456 678
UUID34567 456
UUID45678
UUID56789

$ cat moose.txt
UUID12345 1   ABC 1 345
UUID23456 2   XYZ 4 763 ABC 4 678
UUID34567 3   XYZ 4 763 ABC 2 456 QRS 2 456
UUID45678 2   DEF 1 345 TUV 8 111
UUID56789 0

$

根据您的描述,从UUID45678开始的行应该有2个段,但它只包含1个。拾取效果很好。我编辑了示例。还有一些澄清,一行可以包含多个ABC段吗?格式总是3个字母、空格、1个数字、空格、3个数字吗?您说最后3个字符,但实际使用的是7,8,9而不是8,9,10。您的一些示例示例数据行以两个空格结尾,有些结尾有一个空格,最后一个结尾没有空格。实际数据是否如此?根据您的描述,以UUID45678开头的行应该有两个段,但它只包含1个。拾取效果很好。我编辑了示例。还有一些澄清,一行可以包含多个ABC段吗?格式始终是3个字母,s配速,1位数,空格,3位数?你说的是最后3个字符,但你实际使用的是7,8,9而不是8,9,10。你的一些示例数据行以两个空格结尾,一些有一个空格,最后一个没有。实际数据是这样的吗?这对我来说不太合适,因为我的文件有固定的字段长度,但有些字段是可选的。因此,字段的数量是per行在61和95之间变化。但是,我的多段数据开始的区域处于固定位置,所以我只是以您的示例进行了修改,它成功了!我用解决问题的修复程序更新了我的问题。如果有任何问题,请告诉我。这对我不太合适,因为我的文件具有固定的字段长度,但是有些字段是可选的。因此每行的字段数在61到95之间变化。但是,我的多段数据开始的区域位于固定位置,所以我只是以您的示例进行了修改,结果成功了!我用解决问题的修复程序更新了我的问题。如果有任何问题,请告诉我。很好。While这也适用于我上面的人工示例,我的真实文件有~1000个字符长的行,文件中的每个字段都是固定长度的,有些字段是可选的。因此,这对我的真实文件不起作用,但它确实很有趣。很好。虽然这也适用于我上面的人工示例,但我的真实文件有这样的行大约1000个字符长,文件中的每个字段都是固定长度,有些字段是可选的。因此,这在我的真实文件中不起作用,但它确实很有趣。