如何打印文件中具有某些字段小于某些输入值的所有行

时间:2019-02-25 20:06:52

标签: shell awk sed grep cut

我有一个文件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的任何产品,我都需要打印所有行。如何实现?

2 个答案:

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