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

how to print all lines in a file which has certain field less than some input value

我有一个文件 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 的任何产品的所有行。我将如何实现?

一个不太稳健的方法是:

$ 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" 并检查下一个字段中的值(由于 = 分隔符)。

awk 的另一种方式:

awk '
  {
  i = split ( [=10=] , a , /Weight=/ )
  for ( j = 2 ; j <= i ; j++ ) {
    sub ( /,.*/ , "" , a[j] )
    if ( a[j]+0 < 100 ) {
      print
      next
      }
    }
  }
' infile