
Wie liste ich alle TXT-Dateien (durch Pipes getrennte Dateien) und die Anzahl der Spalten jeder Datei in einem Verzeichnis auf?
Antwort1
find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
FNR == 1 {print FILENAME ": " NF; nextfile}' {} +
Würde so etwas drucken wie
./dir/foo.txt: 2
für jede reguläre, nicht leere Datei, deren Name mit endet, .txt
wobei "2"
die Anzahl der |
durch - getrennten Felder in der ersten Zeile der Datei ist.
Beachten Sie, dass dies nextfile
nicht in allen Implementierungen verfügbar ist awk
. In den Implementierungen, in denen dies nicht der Fall ist, sollte es jedoch harmlos sein (nur weniger effizient, da awk
die Dateien vollständig gelesen würden).
Wenn Sie nur die Dateien berücksichtigen möchten, die in allen nicht leeren Zeilen die gleiche Anzahl Spalten aufweisen, geben Sie mit GNU Folgendes ein awk
:
find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
BEGINFILE {n = 0}
NF {
if (n && NF != n) {
print "skipping "FILENAME" ("NF" != "n")" > "/dev/stderr"
n = 0; nextfile
}
n = NF
}
ENDFILE {if (n) print FILENAME ": " n}' {} +
Antwort2
Ein anderer Ansatz für alleawkImplementierung:
find . -type f -name "*.txt" -exec awk -F'|' 'NF{ print FILENAME,NF; exit }' {} \;
-F'|'
|
- als Feldtrennzeichen behandelnNF{ ... }
- stellt sicher, dass die Datei mindestens ein Feld/eine Spalte enthält.NF
selbst zeigt auf die Anzahl der Spalten
Antwort3
find . -name "*.txt" -type f -exec wc -l {} \;
Antwort4
Ihre Frage ist nicht ganz klar, aber Sie können diesen Befehl versuchen:
find DIRECTORY -name "*.txt" | xargs awk -F "SEPARATOR" "{print FILENAME, NF }"
Ersetzen Sie einfach DIRECTORY
und SEPARATOR
durch Ihr Verzeichnis und Spaltentrennzeichen.