awk несколько строк в нескольких полях - PullRequest
0 голосов
/ 28 июня 2018

У меня есть файл

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 голосов
/ 28 июня 2018

Не могли бы вы попробовать и дайте мне знать, если это поможет вам.

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

Если я правильно читаю, ОП говорит больше, чем поле 5 Папайя и Дыня не должны приходить

и в полях больше 5 = яблоко, виноград, апельсин или лимон, а не будь дыней или папайей

Итак, помните, что написали это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...