/ / Como contar o número de valores exclusivos de um campo em um arquivo de texto delimitado por tabulação? - linux, bash, linha de comando

Como contar o número de valores exclusivos de um campo em um arquivo de texto delimitado por tabulação? - linux, bash, linha de comando

Tenho um arquivo de texto com uma grande quantidade de dados delimitado por tabulação. Quero dar uma olhada nos dados de modo que possa ver os valores exclusivos em uma coluna. Por exemplo,

Red     Ball 1 Sold
Blue    Bat  5 OnSale
...............

Então, é como se a primeira coluna tivesse cores, então eu quero saber quantos valores únicos diferentes existem nessa coluna e quero ser capaz de fazer isso para cada coluna.

Eu preciso fazer isso em uma linha de comando do Linux, provavelmente usando algum script bash, sed, awk ou algo assim.

Adendo: Obrigado a todos pela ajuda, posso perguntar mais uma coisa? E se eu também quisesse uma contagem desses valores exclusivos?

Acho que não coloquei a segunda parte claramenteo suficiente. O que eu queria fazer é ter uma contagem de "cada" desses valores exclusivos e não saber quantos valores exclusivos existem. Por exemplo, na primeira coluna eu quero saber quantos objetos coloridos de Vermelho, Azul, Verde etc. estão lá.

Respostas:

66 para resposta № 1

Você pode fazer uso de cut, sort e uniq comandos da seguinte forma:

cat input_file | cut -f 1 | sort | uniq

obtém valores exclusivos no campo 1, substituindo 1 por 2, você obterá valores exclusivos no campo 2.

Evitando UUOC :)

cut -f 1 input_file | sort | uniq

EDITAR:

Para contar o número de ocorrências únicas, você pode usar wc comando na cadeia como:

cut -f 1 input_file | sort | uniq | wc -l

8 para resposta № 2

Você pode usar awk, sort & uniq para fazer isso, por exemplo, para listar todos os valores únicos na primeira coluna

awk < test.txt "{print $1}" | sort | uniq

Conforme postado em outro lugar, se você quiser contar o número de instâncias de algo, você pode canalizar a lista exclusiva para wc -l


6 para resposta № 3
cat test.csv | awk "{ a[$1]++ } END { for (n in a) print n, a[n] } "

2 para resposta № 4

Supondo que o arquivo de dados esteja realmente separado por tabulação, não alinhado com espaço:

<test.tsv awk "{print $4}" | sort | uniq

Onde $ 4 serão:

  • $ 1 - vermelho
  • $ 2 - bola
  • $ 3 - 1
  • $ 4 - vendido

2 para resposta № 5
# COLUMN is integer column number
# INPUT_FILE is input file name

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l

0 para a resposta № 6

Aqui está um script bash que responde totalmente ao(revisada) questão original. Ou seja, dado qualquer arquivo .tsv, ele fornece a sinopse para cada uma das colunas por vez. Além do próprio bash, ele usa apenas ferramentas * ix / Mac padrão: sed tr wc cut sort uniq.

#!/bin/bash
# Syntax: $0 filename
# The input is assumed to be a .tsv file

FILE="$1"

cols=$(sed -n 1p $FILE | tr -cd "t" | wc -c)
cols=$((cols + 2 ))
i=0
for ((i=1; i < $cols; i++))
do
echo Column $i ::
cut -f $i < "$FILE" | sort | uniq -c
echo
done

0 para resposta № 7

Este script mostra o número de valores únicosem cada coluna de um determinado arquivo. Ele assume que a primeira linha de determinado arquivo é a linha de cabeçalho. Não há necessidade de definir o número de campos. Basta salvar o script em um arquivo bash (.sh) e fornecer o arquivo delimitado por tabulação como um parâmetro para este script.

Código

#!/bin/bash

awk "
(NR==1){
for(fi=1; fi<=NF; fi++)
fname[fi]=$fi;
}
(NR!=1){
for(fi=1; fi<=NF; fi++)
arr[fname[fi]][$fi]++;
}
END{
for(fi=1; fi<=NF; fi++){
out=fname[fi];
for (item in arr[fname[fi]])
out=out"t"item"_"arr[fname[fi]][item];
print(out);
}
}
" $1

Exemplo de execução:

bash> ./script.sh <path to tab-delimited file>

Exemplo de saída

isRef    A_15      C_42     G_24     T_18
isCar    YEA_10    NO_40    NA_50
isTv     FALSE_33  TRUE_66