Исключить одну строку из моего «кота», сохранить несколько похожих строк - PullRequest
0 голосов
/ 27 февраля 2020

Вот моя проблема, у меня есть команда сценария, подобная этой:

cat /home/tmp/stats* | grep "test" | grep 'Default;;' | sort

2020-01-26 11:01:31;10433;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;end;success;90231
2020-01-26 11:15:01;19260;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;begin;;
2020-01-26 11:15:54;19260;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;end;success;53294
2020-01-26 11:30:02;25161;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;begin;;
2020-01-26 11:31:16;25161;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;end;success;74425

Я хотел бы добавить предупреждение, которое «если вы сталкиваетесь с тем же кодом (10433, 19260, 25161) меньше чем дважды, то вы исключаете его из списка. "

Как это:

cat /home/tmp/stats* | grep "test" | grep 'Default;;' | [if the code appears only once, exclude] | sort

2020-01-26 11:15:01;19260;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;begin;;
2020-01-26 11:15:54;19260;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;end;success;53294
2020-01-26 11:30:02;25161;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;begin;;
2020-01-26 11:31:16;25161;SERVICES;test;_AVaHYDcvqbshjdkzah3w;0.1;Default;;end;success;74425

Возможно ли это в одной строке? Если нет, то как я могу это сделать?

Заранее спасибо.

1 Ответ

3 голосов
/ 27 февраля 2020

1-е решение (с попыткой ОП): Не могли бы вы попробовать следующее.

your_command | awk 'BEGIN{FS=";"} {a[$2]++;b[$2]=(b[$2]?b[$2] ORS:"")$0} END{for(i in a){if(a[i]>=2){print b[i]}}}'

Объяснение: Добавление подробного пояснения к приведенному выше коду.

your_command |                     ##Sending OP command output to next awk command.
awk '                              ##Starting awk command from here.
BEGIN{                             ##Starting BEGIN section from here.
  FS=";"                           ##Setting FS(field separator) as semi-colon here.
}
{
  a[$2]++                          ##Creating an array a with index $2(2nd field of current line) with increasing value by 1 each time it comes here.
  b[$2]=(b[$2]?b[$2] ORS:"")$0     ##Creating an array b with index $2 and keep concatenating its own value in it.
}
END{                               ##Starting END block for this awk program from here.
  for(i in a){                     ##Traversing thorough array a here.
    if(a[i]>=2){                   ##Checking condition if value of array a with index i is greater than or equal to 2.
      print b[i]                   ##Printing value of array b with index i here.
    }
  }
}
'


2-е решение (попытка сделать это одной командой): ИЛИ пытаясь сделать это одной командой, увидев попытку ОП:

awk '
BEGIN{
  FS=";"
}
!/test|default/{
  next
}
{
  a[$2]++
  b[$2]=(b[$2]?b[$2] ORS:"")$0
}
END{
  for(i in a){
    if(a[i]>=2){
      print b[i]
    }
  }
}
' /home/tmp/stats*
...