我有一个文件file_name,其行如下:
line1: Order='O1', ProductDetail: [Product='P1', Weight=100, Unit=Kg], ProductDetail: [Product='P2', Weight=90, Unit=Kg], ProductDetail: [Product='P3', Weight=110, Unit=Kg]
line2: Order='O2', ProductDetail: [Product='P1', Weight=100, Unit=Kg], ProductDetail: [Product='P2', Weight=100, Unit=Kg], ProductDetail: [Product='P3', Weight=110, Unit=Kg]
预期输出:
line1: Order='O1', ProductDetail: [Product='P1', Weight=100, Unit=Kg], ProductDetail: [Product='P2', Weight=90, Unit=Kg], ProductDetail: [Product='P3', Weight=110, Unit=Kg]
理想的预期输出:
line1: Order='O1', [Product='P2', Weight=90, Unit=Kg]
对于重量小于100的任何产品,我都需要打印所有行。如何实现?
答案 0 :(得分:0)
一种不太健壮的方法是:
$ awk -F'[ =,]' '{for(i=1;i<NF;i++)
if($i=="Weight" && $(i+1)<100)
{print; next}}' file
line1: Order='O1', ProductDetail: [Product='P1', Weight=100, Unit=Kg], ProductDetail: [Product='P2', Weight=90, Unit=Kg], ProductDetail: [Product='P3', Weight=110, Unit=Kg]
根据输入文件的结构设置定界符,找到搜索标签“ Weight”并检查下一个字段中的值(由于=
定界符)。
答案 1 :(得分:0)
与AWK的另一种方法:
awk '
{
i = split ( $0 , a , /Weight=/ )
for ( j = 2 ; j <= i ; j++ ) {
sub ( /,.*/ , "" , a[j] )
if ( a[j]+0 < 100 ) {
print
next
}
}
}
' infile