Gegeben eine Datei mit Daten wie diese (dh die Datei storage.dat)
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?
dh im obigen Beispiel wäre es 4. (Anzahl der Pipe-Zeichen + 1 in der ersten Zeile)
Ich dachte so etwas wie:
awk '{ FS = "|" } ; { print NF}' stores.dat
Es werden jedoch alle Zeilen anstelle der ersten und für die erste Zeile 1 anstelle von 4 zurückgegeben
awk -F'|' 'NR==1{print NF}' stores.dat
exit
ist der richtige Weg, um es zu tun. Sie müssen nicht die gesamte Datei lesen, wenn Sie nur die Anzahl der Spalten wissen möchten. +1 :)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
quelle
Sofern Sie dort keine Leerzeichen verwenden, sollten Sie diese in
| wc -w
der ersten Zeile verwenden können.wc
ist "Word Count", das einfach die Wörter in der Eingabedatei zählt. Wenn Sie nur eine Zeile senden, wird die Anzahl der Spalten angezeigt.quelle
|
ein Leerzeichen ersetzen - eswc
werden Wörter gezählt, die durch Leerzeichen getrennt werden müssen. Verwenden Siehead -1 stores.dat | tr '|' ' ' | wc -w
Du könntest es versuchen
quelle
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
quelle
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
quelle
cat x.txt | python -c "print raw_input().count('|') + 1"
Dies ist normalerweise das, was ich zum Zählen der Anzahl der Felder verwende:
head -n 1 file.name | awk -F'|' '{print NF; exit}'
quelle
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
quelle
Basierend auf der Antwort von Cat Kerr. Dieser Befehl arbeitet mit Solaris
awk '{print NF; exit}' stores.dat
quelle
Sie können versuchen:
quelle
Richtig rein Bash Weg
Unter Bash könnte man einfach:
IFS=\| read -ra headline <stores.dat echo ${#headline[@]} 4
Viel schneller als ohne Gabeln und wiederverwendbar, wenn Sie
$headline
die volle Schlagzeile halten. Sie könnten zum Beispiel:printf " - %s\n" "${headline[@]}" - sid - storeNo - latitude - longitude
Hinweis Diese Syntax steuert Leerzeichen und andere Zeichen in Spaltennamen korrekt.
Alternative: Starke binäre Überprüfung auf maximale Spalten in jeder Zeile
Was ist, wenn eine Zeile zusätzliche Spalten enthält?
Dieser Befehl sucht nach größeren Zeilen und zählt Trennzeichen :
tr -dc $'\n|' <stores.dat |wc -L 3
Es gibt maximal 3 Trennzeichen, dann 4 Felder.
quelle