Найти и напечатать самое большое слово с рисунком - PullRequest
0 голосов
/ 19 января 2019

В настоящее время у меня есть файл журнала, и я должен отфильтровать информацию, чтобы получить самое длинное слово, заканчивающееся несколькими символами, используя команду "grep".

Например, я должен найти слова, заканчивающиеся на "abc".

И у меня есть следующий файл:

XXXXXabc
YYabc
ZZZdef
XXabc

Правильный вывод должен быть:

XXXXXabc

До сих пор я пробовал со следующим:

grep -E '\abc' log.txt | wc -L

Но это возвращает максимальную длину без отображения слова. Как сделать так, чтобы слово печаталось на экране?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Grep не может сделать это в одиночку, но с помощью awk:

awk '/abc$/{m=length($0)>length(m)?$0:m}END{print m}' infile
0 голосов
/ 19 января 2019

С помощью одной команды awk вы можете получить ее:

awk 'BEGIN {global_max = 0} /abc$/ {cur_max=length($0); if (cur_max > global_max) {global_max=cur_max; word=$0}} END {print word}' log.txt

Используйте переменную global_max, которая будет отслеживать самое длинное увиденное слово (инициализировать в ноль в блоке BEGIN).

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

Наконец, напечатайте найденное слово.

0 голосов
/ 19 января 2019

Использование sort будет работать медленнее (сложность O(n log n)). Вы должны посещать каждый элемент только один раз, как показано ниже (сложность O(n):

maxSize=0; maxWord=""; while read -r LINE; do if [[ ${#LINE} -gt $maxSize ]]; then maxSize=${#LINE}; maxWord="${LINE}"; fi; done < input.txt; echo "$maxWord"
0 голосов
/ 19 января 2019
grep -E \abc log.txt | awk '{print length($1) " " $1}' | sort -n |  tail -1 | awk '{print $2}'

Идея: найти длину, отсортировать по числу, а затем из последней строки вывести только 2-й элемент.

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