Linux команда - Как удалить дубликаты строк, которые содержат метку времени - PullRequest
1 голос
/ 30 апреля 2020

Возможно ли удалить «дублированные» строки. Строки содержат метку времени, так что я не могу легко uniq?

Например:

start=12345 end=23456 ERROR=X091
start=12346 end=23457 ERROR=X091
start=12347 end=23458 ERROR=X091
start=12345 end=23456 ERROR=A777
start=12346 end=23457 ERROR=A777
start=12347 end=23458 ERROR=A777

Изображения с тысячами строк, и я хочу знать, сколько именно ошибок типа ERROR. Как я хочу вывод:

start=12346 end=23457 ERROR=X091
start=12347 end=23458 ERROR=A777

Ответы [ 3 ]

3 голосов
/ 30 апреля 2020

Если я понимаю требование, вам нужно распечатать уникальные коды ошибок. Это должно быть так просто.

$ uniq -f 2  r.txt 
start=12345 end=23456 ERROR=X091
start=12345 end=23456 ERROR=A777

-f => игнорировать первые 2 поля. Поля отделяются пробелом.

С другой стороны, если вас также интересует подсчет количества раз, которое происходит каждый код ошибки, это поможет.

$ cut -f3 -d' ' r.txt | uniq -c 
   3 ERROR=A777
   3 ERROR=X091

Для вырезания:

-f3 => вернуть 3-е поле. -d => используемый разделитель.

Для uniq:

- c => напечатать счет

1 голос
/ 30 апреля 2020

с использованием awk

awk '{a[$3]=$0;} END { for (i in a) print a[i]}' file.txt

Демо:


$cat file.txt
start=12345 end=23456 ERROR=X091
start=12346 end=23457 ERROR=X091
start=12347 end=23458 ERROR=X091
start=12345 end=23456 ERROR=A777
start=12346 end=23457 ERROR=A777
start=12347 end=23458 ERROR=A777
$awk -F" " '{a[$3]=$0;} END { for (i in a) print a[i]}' file.txt
start=12347 end=23458 ERROR=X091
start=12347 end=23458 ERROR=A777
$

1 голос
/ 30 апреля 2020

Если все, что вас интересует, это узнать, сколько типов ошибок у вас есть, вы можете использовать sed для удаления метки времени, тогда вы можете запустить uniq для результата.

Если вам нужно для работы с выходом командной строки вы можете передать его по следующему адресу:

sed 's/.*\(ERROR=.*\)/\1/' | uniq

Например:

echo "start=12345 end=23456 ERROR=X091
start=12346 end=23457 ERROR=X091
start=12347 end=23458 ERROR=X091
start=12345 end=23456 ERROR=A777
start=12346 end=23457 ERROR=A777
start=12347 end=23458 ERROR=A777" | sed 's/.*\(ERROR=.*\)/\1/' | uniq

Дает:

ERROR=X091
ERROR=A777

Если вы работаете из файла вы можете использовать:

sed 's/.*\(ERROR=.*\)/\1/' file | uniq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...