Подсчитать каждую строку поиска выходных awk в файле

Я постараюсь быть конкретным и понятным.

У меня есть файл: log.txt он содержит несколько строк, которые я ищу, чтобы напечатать и подсчитать каждую из них.

Это моя команда, печатать только совпадения столбцов в файле log.txt :

 sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}' 

объяснение

 sed -n '1p' //prints the first line awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}' //prints the next columns from the number 25 column 

Входные данные :

 Column25 Column26 Column27 ColumnN <--#first filter:I need obtain specific headers. ColumnN Column25 Column27 ColumnN Column26 Column27 <--#Count how many times is repeat every string in whole file 

Выход:

 Column25 Column26 Column27 Column28 Column29 ColumnN 

Я пытаюсь сделать: Из предыдущего вывода я хочу подсчитать все совпадения в одном файле file.log но в той же команде:

 sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}' 

и отправьте снова на вывод, как:

Желаемый результат:

 Column25 - n times Column26 - n times Column27 - n times Column28 - n times Column29 - n times ColumnN - n times 

PS. Я думал использовать ту же самую переменную "$s" в цикле for, чтобы начать поиск, но она не работает.

Вот как я могу подойти к этой проблеме:

 awk '{n=1;if(NR==1)n=25;for(i=n;i<=NF;i++) a[$i]++} END{for(val in a) print val,a[val]}' input.txt 

Тот факт, что вы хотите захватить поля 25 и после в первой строке, требует от нас проверки переменной NR и установки переменной n которая будет использоваться в цикле. Что касается a[$i]++ то это будет ассоциативный массив с полями, являющимися ключами, а значения в массиве будут увеличиваться с помощью оператора ++ . Это очень типичный метод подсчета полей в awk.

Как насчет

 awk '{for (i=25; i<=NF; i++) print $i; exit}' file | sort | uniq -c 6 string1 6 string2 6 string3 6 string4 6 string5 6 stringN 

РЕДАКТИРОВАТЬ: В недавно добавленном примере ввода у вас нет 24 полей, которые нужно игнорировать перед началом подсчета, и ограничение в первой строке (как видно из вашего первого fragmentа кода), похоже, прошло. Пытаться

 tr -s ' ' '\n'