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 № 1Você 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