compara rapidamente os valores em um arquivo de texto

1

Eu tenho um arquivo de texto com 2 colunas primeira coluna é um nome, segunda colomn é um valor de tempo. como:

cat  34M
dog  34M
fish 12M
ant  34M

Eu preciso comparar o segundo colomn para os mesmos valores, e se 1 for diferente do resto eu quero sinalizar a entrada. Portanto, neste caso, o peixe deve ser sinalizado porque é diferente do resto. O arquivo é dinâmico e é alterado por um loop for em uma base de pasta, portanto, Meu script deve executar a comparação em um loop for.

for FOLDER in is find ${DIR}/ -maxdepth 1 -type f -name values.txt'; do
<something to flag the 'odd' value>
done

Eu acho que eu deveria classificar na segunda colomn primeiro e então pegar o primeiro valor (maior) como marcador para comparar. O arquivo pode conter mais de 1 'ímpar' valores. O arquivo pode conter entre 2 e 500 entradas. Eu poderia fazer algo com um sub-script ou com o awk, mas não tenho ideia de por onde começar.

Obrigado por me ajudar.

    
por SHLelieveld 22.02.2017 / 13:25

3 respostas

1

Se os valores couberem na memória, o que você deve 'até 500', e dependendo exatamente do que você quer, awk provavelmente poderá fazê-lo em um passe e (pelo menos na maior parte) em um processo.

Para listar todos os valores que ocorrem uma vez, em ordem arbitrária, se houver mais de um:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1)print a[v],v}'
# can pipe output to a suitable sort if you want a specific order
# or for GNU awk 4, you can get several non-arbitrary orders
# (less than GNU sort) using PROCINFO["sorted_in"] see the manual

Para listar um valor que ocorre uma vez, se houver pelo menos um:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit}}'

Para listar um valor que ocorre uma vez e, caso contrário, indicar que não há nenhum:

awk '!n[$2++]{a[$2]=$1} END{for(v in n)if(n[v]==1){print a[v],v;exit};print "no unique entry"}'
    
por 22.02.2017 / 18:00
1

Uma maneira de fazer isso:

awk -v std="$( awk '{print $2}' file.txt | \
    sort | \
    uniq -c | \
    sort -rn | \
    awk 'NR==1 {print $2; exit}' )" '$2!=std' file.txt

O comando longo em $(...) determina o valor de tempo mais comum, enquanto o comando awk externo seleciona todas as entradas com valores diferentes na segunda coluna. O script não leva em conta possíveis "aliases" de tempo, como 1M = 60S etc., apenas processa 12M e 34M como strings.

    
por 22.02.2017 / 14:07
-1

Você já tentou usar o diff? Se a sua primeira coluna corresponder aos dois arquivos, essa ferramenta se ajustará perfeitamente. Caso contrário, você pode simplesmente pegar a segunda coluna e compará-la com diff. Você pode usar o diff no seu script também.

link

    
por 22.02.2017 / 13:31