Polecenie uniksowe, aby uzyskać liczbę wierszy w pliku CSV

22

Muszę uzyskać liczbę wierszy z przychodzących plików CSV.

Użyłem następującego polecenia, aby uzyskać liczbę.

wc -l filename.csv

Rozważmy plik z 1 rekordem, otrzymuję kilka plików z \*na początku, a dla tych plików, jeśli wydam powyższe polecenie, zwraca liczbę 0.

Dlaczego \*na początku pliku nie rejestruje się jako zliczana linia i czy jest jakieś obejście?

Devoloper250
źródło
spróbuj "cat filename.csv | wc -l"
chaput
4
„cat filename.csv | wc -l” logicznie robi to samo, co „wc -l filename.csv”, ale jest mniej wydajne i eleganckie
Alex
Devoloper250, czy mógłbyś jeszcze bardziej wyjaśnić ten ostatni akapit? Przykład może również pomóc.
Alex
np .: Iam otrzymuję pliki csv z 1 rekordem, które mają * (gwiazdkę) na początku linii. Kiedy wystawiam wc -l fn.csv iam, liczę jako 0, ale idealnie powinno być 1. Czy * (gwiazdka) ma coś do zrobienia, jak inne symbole wieloznaczne?
Devoloper250,
Jakie są wyniki po uruchomieniu „cat filename.csv”? Jakiej dystrybucji używasz?
JNevill,

Odpowiedzi:

9

Trikiem zapewniającym, że liczone są również nieterminiczne linie, może być:

cat filename.csv | xargs -l echo | wc -l

To wydaje się liczyć wszystkie niepuste linie, ale pomija puste linie.

Należy pamiętać, że jest to raczej nieefektywne, ale prawdopodobnie nie stanowi to problemu w przypadku użycia okazjonalnego.

Inna możliwość, zlicza wszystkie linie, w tym nie zakończoną ostatnią linię:

awk '{n+=1} END {print n}' filename.csv

Testowane na RHEL 6.2. YMMV.

Trygve Flathen
źródło
to awkpolecenie działa na OS X
Micah Stubbs
1

wc zgłosi 0 dla plików z tylko jedną linią i bez nowej linii. Może Twoje jednoskładnikowe pliki CSV są takie? Możesz wyszukać końcowe znaki nowej linii za pomocą hexdump, np .:

hexdump -C fn.csv

Poszukaj kodu ascii 0a na końcu.

Trygve Flathen
źródło