it-swarm.com.de

Unix - Anzahl der Spalten in der Datei

Bei einer Datei mit solchen Daten (d. H. Stores.dat-Datei)

sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200

Was wäre ein Befehl, um die Anzahl der Spaltennamen auszugeben?

im obigen Beispiel wäre es 4. (Anzahl der Pipe-Zeichen + 1 in der ersten Zeile)

Ich dachte etwas wie:

awk '{ FS = "|" } ; { print NF}' stores.dat

es werden jedoch alle Zeilen anstelle der ersten zurückgegeben, und für die erste Zeile wird 1 anstelle von 4 zurückgegeben

63
toop
awk -F'|' '{print NF; exit}' stores.dat 

Beenden Sie einfach direkt nach der ersten Zeile.

98
Mat

Dies ist eine Problemumgehung (für mich: Ich benutze awk nicht sehr oft):

Zeigen Sie die erste Zeile der Datei mit den Daten an, ersetzen Sie alle Pipes durch Zeilenumbrüche und zählen Sie dann die Zeilen:

$ head -1 stores.dat | tr '|' '\n' | wc -l
34
miku

Sofern Sie dort keine Leerzeichen verwenden, sollten Sie in der ersten Zeile | wc -w Verwenden können.

wc ist "Word Count", bei dem die Wörter in der Eingabedatei einfach gezählt werden. Wenn Sie nur eine Zeile senden, wird die Anzahl der Spalten angezeigt.

11

Du könntest es versuchen

katze DATEI | awk '{print NF}'

4
Cat Kerr

Wenn Sie python installiert haben, können Sie versuchen:

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat
1
Don Question

Perl-Lösung ähnlich der awk-Lösung von Mat:

Perl -F'\|' -lane 'print $#F+1; exit' stores.dat

Ich habe dies an einer Datei mit 1000000 Spalten getestet.


Wenn das Feldtrennzeichen ein Leerzeichen (ein oder mehrere Leerzeichen oder Tabulatoren) anstelle einer Pipe ist:

Perl -lane 'print $#F+1; exit' stores.dat
1
Chris Koknat

Dies ist normalerweise das, was ich zum Zählen der Anzahl der Felder benutze:

head -n 1 file.name | awk -F'|' '{print NF; exit}'
1
user2533399

Richtig rein bash Weg

Unter Bash können Sie einfach:

IFS=\| read -ra headline <stores.dat
echo ${#headline[@]}
4

Sehr viel schneller als ohne Gabeln und wiederverwendbar als $headline halte die volle Kopfzeile. Sie könnten zum Beispiel:

printf " - %s\n" "${headline[@]}"
 - sid
 - storeNo
 - latitude
 - longitude

Hinweis Mit dieser Syntax werden Leerzeichen und andere Zeichen in Spaltennamen korrekt eingegeben.

Alternative: Starke binäre Überprüfung auf maximale Spalten in jeder Zeile

Was ist, wenn einige Zeilen zusätzliche Spalten enthalten?

Dieser Befehl sucht nach einer größeren Zeile und zählt Trennzeichen:

tr -dc $'\n|' <stores.dat |wc -L
3

Es gibt maximal 3 Trennzeichen, dann 4 Felder.

0
F. Hauri

Basierend auf der Antwort von Cat Kerr. Dieser Befehl funktioniert unter Solaris

awk '{print NF; exit}' stores.dat
0
Manu Mitra

wählen Sie eine beliebige Zeile in der Datei aus (im folgenden Beispiel ist es die 2. Zeile) und zählen Sie die Anzahl der Spalten, wobei das Trennzeichen ein Leerzeichen ist:

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l
0
sAguinaga

sie können versuchen:

head -1 stores.dat | grep -o \|  | wc -l
0
user7231103