2010-08-17 26 views
31

Tengo un archivo de texto con una gran cantidad de datos delimitados por tabuladores. Quiero echar un vistazo a los datos para poder ver los valores únicos en una columna. Por ejemplo,¿Cómo contar el número de valores únicos de un campo en un archivo de texto delimitado por tabulaciones?

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

Por lo tanto, es como la primera columna tiene colores, por lo que quieren saber cuántos diferentes valores únicos que hay en la columna y yo quiero ser capaz de hacer eso para cada columna.

Necesito hacer esto en una línea de comandos de Linux, así que probablemente use algunos script bash, sed, awk o algo así.

Addendum: Gracias a todos por la ayuda, ¿puedo pedir una cosa más? ¿Y si también quisiera contar estos valores únicos?

Supongo que no puse la segunda parte con suficiente claridad. Lo que quería hacer es tener un recuento de "cada uno" de estos valores únicos, sin saber cuántos valores únicos hay. Por ejemplo, en la primera columna quiero saber cuántos objetos de colores rojos, azules, verdes, etc. hay allí.

+5

'uniq -c' recuentos por elemento. –

+0

@Dennis gracias, esto es lo que necesitaba. Me gusta mucho lo poderosa pero simple que es realmente la línea de comandos de Linux. Necesito comenzar a aprenderlo correctamente :). – sfactor

Respuesta

65

Puede hacer uso de cut, sort y uniq comandos de la siguiente manera:

cat input_file | cut -f 1 | sort | uniq 

obtiene valores únicos en el campo 1, en sustitución de 1 por 2 le dará valores únicos en el campo 2.

evitar UUOC :)

cut -f 1 input_file | sort | uniq 

EDIT:

para contar el número de ocurrencias únicos que se pueden hacer uso de wc comando en la cadena como:

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

también puede usar 'ordenar -u' en lugar de' ordenar | uniq' – Hasturkun

+18

'uniq -c' dará los recuentos por artículo -' wc -l' contará el número total de elementos. –

+2

+1 Gracias @codaddict et al. 'uniq -c' fue lo último que necesité ... – hafichuk

8

Puede usar awk, clasificar & uniq para hacer esto, por ejemplo, para enumerar todas las únicas los valores de la primera columna

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

Como se publican en otro lugar, si se desea contar el número de instancias de algo que puede canalizar la lista única de wc -l

2

Suponiendo que el archivo de datos es en realidad separados por tabulaciones, no el espacio alineado:

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

Donde $ 4 será:

  • $ 1 - Rojo
  • 2 $ - Bola
  • $ 3 - 1
  • $ 4 - Vendido
2
# COLUMN is integer column number 
# INPUT_FILE is input file name 

cut -f ${COLUMN} < ${INPUT_FILE} | sort -u | wc -l 
5
cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } ' 
0

Aquí hay un script bash que responde completamente a la pregunta original (revisada). Es decir, dado cualquiera.tsv file, proporciona la sinopsis de cada una de las columnas sucesivamente. Además de bash, solo utiliza herramientas estándar * ix/Mac: 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

Este script genera el número de valores únicos en cada columna de un archivo determinado. Asume que la primera línea del archivo dado es la línea del encabezado. No hay necesidad de definir el número de campos. Simplemente guarde el script en un archivo bash (.sh) y proporcione el archivo delimitado por tabulaciones como un 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 

Ejecución Ejemplo:

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

de salida Ejemplo

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