【问题标题】:awk multiple strings in multiple fieldsawk 多个字段中的多个字符串
【发布时间】:2018-06-28 04:49:58
【问题描述】:

我有一个文件

文件.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

【问题讨论】:

  • 请在您的帖子中也使用代码标签发布预期的输出。
  • 您的要求不明确。你是说从 7 开始的所有字段只能包含 Apple、Grape、Orange 或 Lemon?如果是这样,为什么要提到甜瓜或木瓜呢?如果不是,那你在说什么? edit 您的问题包括简洁、可测试的样本输入和预期输出。
  • 感谢反馈,重新写了我的问题,现在你明白了吗?

标签: shell awk command-line


【解决方案1】:

您能否尝试关注一下,如果这对您有帮助,请告诉我。

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 Papaya 和 Melon 不应该来

并且在大于 5 的字段中 = Apple、Grape、Orange 或 Lemon 而不是 是甜瓜还是木瓜

所以记住这一点才写了这个。

【讨论】:

  • tks 很多 RavinderSingh13
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多