it-swarm.com.de

Wie zählt man die Anzahl eindeutiger Werte eines Feldes in einer durch Tabulatoren getrennten Textdatei?

Ich habe eine Textdatei mit einer großen Datenmenge, die durch Tabulatoren getrennt ist. Ich möchte mir die Daten so ansehen, dass ich die eindeutigen Werte in einer Spalte sehen kann. Zum Beispiel,

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

Es ist also so, als hätte die erste Spalte Farben, also möchte ich wissen, wie viele verschiedene eindeutige Werte in dieser Spalte vorhanden sind, und ich möchte das für jede Spalte tun können.

Ich muss dies in einer Linux-Befehlszeile tun, also wahrscheinlich mit einem bash-Skript, sed, awk oder so etwas.

Nachtrag: Danke an alle für die Hilfe, kann ich noch etwas fragen? Was wäre, wenn ich eine Zählung dieser einzigartigen Werte wollte?

Ich denke, ich habe den zweiten Teil nicht klar genug gesetzt. Was ich wollte, ist eine Zählung von "jedem" dieser eindeutigen Werte, die nicht wissen, wie viele eindeutige Werte vorhanden sind. Zum Beispiel möchte ich in der ersten Spalte wissen, wie viele rote, blaue, grüne usw. farbige Objekte vorhanden sind.  

33
sfactor

Sie können die Befehle cut, sort und uniq wie folgt verwenden:

cat input_file | cut -f 1 | sort | uniq

erhält eindeutige Werte in Feld 1, durch Ersetzen von 1 durch 2 erhalten Sie eindeutige Werte in Feld 2.

UUOC :) vermeiden

cut -f 1 input_file | sort | uniq

EDIT:

Um die Anzahl der eindeutigen Vorkommen zu zählen, können Sie den Befehl wc in der Kette wie folgt verwenden:

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

Sie können awk, sort & uniq verwenden, um beispielsweise alle eindeutigen Werte in der ersten Spalte aufzulisten

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

Wenn Sie die Anzahl der Instanzen von etwas zählen möchten, können Sie die eindeutige Liste an wc -l weiterleiten.

8
Jon Freedman
cat test.csv | awk '{ a[$1]++ } END { for (n in a) print n, a[n] } '
7
Mike

Angenommen, die Datendatei ist durch Tabulatoren getrennt, nicht nach dem Raum ausgerichtet:

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

Wo $ 4 sein werden:

  • 1 € - Rot 
  • $ 2 - Ball 
  • 3 - 1 USD 
  • $ 4 - Verkauft
2
Douglas Leeder
# COLUMN is integer column number
# INPUT_FILE is input file name

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

Hier ist ein Bash-Skript, das die (überarbeitete) ursprüngliche Frage vollständig beantwortet. Das heißt, wenn eine .tsv-Datei vorhanden ist, wird die Zusammenfassung für jede der Spalten der Reihe nach bereitgestellt. Abgesehen von bash selbst werden nur Standard * ix/Mac-Tools verwendet: 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
peak

Dieses Skript gibt die Anzahl eindeutiger Werte in jeder Spalte einer Datei aus. Es wird davon ausgegangen, dass die erste Zeile der angegebenen Datei die Kopfzeile ist. Es ist nicht erforderlich, die Anzahl der Felder festzulegen. Speichern Sie das Skript einfach in einer Bash-Datei (.sh) und geben Sie die tabulatorgetrennte Datei als Parameter für dieses Skript an.

Code

#!/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

Ausführungsbeispiel:

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

Ausgabebeispiel

isRef    A_15      C_42     G_24     T_18
isCar    YEA_10    NO_40    NA_50
isTv     FALSE_33  TRUE_66
0
Amin.A