выбор первых n строк в каждой группе в awk - PullRequest
0 голосов
/ 07 мая 2020

У меня есть текстовый файл с пятью столбцами (разделенные запятыми и отсортированные по группам):

Данные выглядят так:

XXServer, XXServer_1, / ws / GenericSoapPort, 201.324, 2020- 04-08T08: 20: 52.163
XXServer, XXServer_1, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
XXServer, XXServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
XXServer, XXServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
YYServer, YYServer_1, / ws / GenericSoapPort, 408.214, 2020-04-08T14: 36: 26.434
YYServer, YYServer_1, / ws / GenericSoapPort, 201.324, 2020-04-08T08: 20: 52.163
YYServer, YYServer_1, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
YYServer, YYServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
YYServer, YYServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
ZZServer_1, ZZServer_1, ZZServer / GenericSoapPort, 408.214, 2020-04-08T14: 36: 26.434
и так далее ...

  1. Хотите распечатать первые 3 строки из каждой группы. Группировка только по первому столбцу.

XXServer, XXServer_1, / ws / GenericSoapPort, 201.324, 2020-04-08T08: 20: 52.163
XXServer, XXServer_1, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20 : 54.966
XXServer, XXServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966

пустая строка

YYServer, YYServer_1, / ws / GenericSoapPort, 408.214, 2020-04-08T14: 36: 26.434
YYServer, YYServer_1, / ws / GenericSoapPort, 201.324, 2020-04-08T08: 20: 52.163
YYServer, YYServer_1, / ws / GenericSoapPort, 201.828, 2020-04- 08T08: 20: 54.966

пустая строка

ZZServer, ZZServer_1, / ws / GenericSoapPort, 408.214, 2020-04-08T14: 36: 26.434

пустая строка

Хотите распечатать первые 3 строки из каждой группы. Группировка на основе первого и второго столбца вместе.

XXServer, XXServer_1, / ws / GenericSoapPort, 201.324, 2020-04-08T08: 20: 52.163
XXServer, XXServer_1, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20 : 54.966

пустая строка

XXServer, XXServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
XXServer, XXServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966

пустая строка

YYServer, YYServer_1, / ws / GenericSoapPort, 408.214, 2020-04-08T14: 36: 26.434
YYServer, YYServer_1, / ws / GenericSoapPort, 201.324, 2020-04-08T08: 20: 52.163
YYServer, YYServer_1, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966

пустая строка

YYServer, YYServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966
YYServer, YYServer_2, / ws / GenericSoapPort, 201.828, 2020-04-08T08: 20: 54.966

1058 * пустая строка

ZZServer, ZZServer_1, / ws / GenericSoapPort, 408.214, 2020-04-08T14: 36: 26.434

пустая строка

Пустая строка - это строка-разделитель групп, которую необходимо вставить в конец каждой группы. В группе может не быть трех строк - условие, о котором необходимо позаботиться.

Я знаю, как использовать группы при использовании групповых функций, таких как sum, max, min et c. Этот, которого я просто не знаю, должен быть простым, но не понимаю.

1 Ответ

0 голосов
/ 07 мая 2020

Предполагая, что ваш второй пример неверен и между YYServer, YYServer_1 и YYServer, YYServer_2 должен быть разрыв (пустая строка), YYServer_2:

 awk -F, '$1!=p {if(p)print ""; p=$1; l=NR+2} NR<=l; END {print ""}'

 awk -F, '$1!=p1||$2!=p2 {if(p1)print ""; p1=$1; p2=$2; l=NR+2} NR<=l; END {print ""}'
 # or
 awk -F, '$1","$2!=p {if(p)print ""; p=$1","$2; l=NR+2} NR<=l; END {print ""}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...