Conte todas as strings da pesquisa de saída do awk em um arquivo

0

Vou tentar ser específico e claro.

Eu tenho um arquivo: log.txt ele contém várias strings que eu pesquisei para imprimir e contar cada uma delas.

Este é o meu comando, apenas coincidências de colunas de impressão no arquivo log.txt :

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

Explicação

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

Entrada:

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

Saída:

Column25
Column26
Column27
Column28
Column29
ColumnN

Eu tento fazer: A partir da saída anterior, quero contar todas as coincidências no mesmo arquivo file.log , mas no mesmo comando:

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

e envie novamente para a saída como:

Saída desejada:

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

PS. Estou pensando em usar a mesma variável "$s" no loop for para iniciar uma pesquisa, mas não está funcionando.

    
por Mareyes 09.08.2018 / 17:56

2 respostas

2

Veja como eu abordaria esse problema:

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

O fato de você querer capturar os campos 25 e depois da primeira linha, exige que verifiquemos a variável NR e defina a variável n que será usada no loop. Quanto ao a[$i]++ que será um array associativo com campos sendo chaves e valores dentro do array será sua contagem incrementada via ++ operator. Este é um método muito típico para contar campos no awk.

    
por 09.08.2018 / 19:51
1

Que tal

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

EDITAR: Em sua amostra de entrada recém-adicionada, você não tem 24 campos para ignorar antes de começar a contagem, e a limitação para a primeira linha (como inferida do seu primeiro trecho de código) parece também foram. Experimente

tr -s ' ' '\n' <file |  sort | uniq -c
  2 Column1
  2 Column2
  3 Column3
  3 ColumnN
    
por 09.08.2018 / 18:17