在多个字段中awk多个字符串

时间:2018-06-28 04:49:58

标签: shell awk command-line

我有一个文件

file.txt

0005663;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Banana;2018-04-24 15:03:16;Grape;2018-04-24 17:13:17;Grape
0005664;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Avocado;2018-04-24 15:03:16;Orange;2018-04-24 17:13:17;Orange
0005665;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Cherry;2018-04-24 15:03:16;Lemon;2018-04-24 15:14:10;Apple;2018-04-24 15:41:10;Orange;2018-04-24 17:13:17;Orange
0005666;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Banana;2018-04-24 15:03:16;Melon;2018-04-24 16:13:11;Grape;2018-04-24 17:13:17;Grape
0005667;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Melon;2018-04-24 15:03:16;Grape;2018-04-24 17:13:17;Grape
0005668;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Cherry;2018-04-24 15:03:16;Grape;2018-04-24 16:13:11;Grape;2018-04-24 17:13:17;Papaya

我的日志有几个字段,具体取决于客户端选择的路径。它可以有7或8、9个字段,可以是14或16 ... 我需要获取具有此路线的行:

  • 在第三字段= Apple
  • 第五个字段=香蕉,鳄梨或樱桃
  • 排在第七位=苹果,葡萄,橙或柠檬,而不是瓜或木瓜

要做到这条通往第七场的路线

awk -F";" '($3~/Apple/) && ($5~/Banana/ || $5~/Avocado/ || $5~/Cherry/) && ($7~/Apple/ || $7~/Grape/ || $7~/Orange/ || $7~/Lemon/) &&! ($7~/Melon/ || $7~/Papaya/)' file.txt

如何处理第九个字段或第十一个字段...而不必为每个长度编写规则?

输出看起来像这样:

0005663;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Banana;2018-04-24 15:03:16;Grape;2018-04-24 17:13:17;Grape
0005664;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Avocado;2018-04-24 15:03:16;Orange;2018-04-24 17:13:17;Orange
0005665;2018-04-24 10:14:58;Apple;2018-04-24 10:34:10;Cherry;2018-04-24 15:03:16;Lemon;2018-04-24 15:14:10;Apple;2018-04-24 15:41:10;Orange;2018-04-24 17:13:17;Orange

1 个答案:

答案 0 :(得分:2)

能否请您尝试以下操作,如果有帮助,请告诉我。

awk -F";" '
($3=="Apple" && ($5=="Banana" || $5=="Avocado" || $5=="Cherry")){
  for(i=6;i<=NF;i++){
    if($i ~ /Apple|Grape|Orange|Lemon/){  flag=1    }
    if($i ~ /Melon|Papaya/)            {  non_flag=1}
  }
  if(!non_flag && flag)                {  print     }
  non_flag=flag=""
}'  Input_file

如果我没看错,OP的意思是说木瓜和瓜不应该超过第5字段

  

且字段大于5 =苹果,葡萄,橙或柠檬而不是   是瓜还是木瓜

因此请牢记这一点。