To jest pytanie, które sprawdziłem teraz dwukrotnie. Takie zachowanie wc jest nieintuicyjne i anty-paradygmatyczne dla zwykłej zwięzłości -nix. Ta zwięzłość istnieje z jakiegoś powodu, ponieważ dokładnie nie chcesz pracować nad wszystkimi rodzajami puszystej nadmiarowości. W końcu znam nazwę pliku, prawda? To, czego chcę, to liczba linii.
W systemie AIX ksh zawsze będzie miał spację poprzedzającą liczbę. Musimy użyć | awk '{print $ 1}' lub a cut, aby usunąć spacje. Innym sposobem przycinania byłoby objęcie echem.
rao
@rao jest poprawne, doda spację przed liczbą. Moje rozwiązanie rozwiązuje ten problem i jest prostsze niż awk czy cut.
Desi Cochrane
@rao W bash nie ma spacji. Skąd pochodzi przestrzeń w ksh? wc -lnie powinien emitować jednego i dlaczego ksh miałby poprzedzać standardowe wyjście programu spacją?
Peter - Przywróć Monikę
Chociaż jest to właściwe obejście (i dość łatwe, że wc nigdy nie zostało zmienione), prawdopodobnie jest wolniejsze i nieintuicyjne. Po pierwsze, spodziewałbym się czegoś takiego 4711 [stdin]jak wyjście.
Peter - Przywróć Monikę
Weź również pod uwagę parowanie z printf "%'d", które zajmuje się przestrzenią i ładnie drukuje duże liczby.
Jeśli nie określono żadnych plików, używane jest standardowe wejście i nie jest wyświetlana żadna nazwa pliku. Monit będzie akceptował dane wejściowe do momentu otrzymania EOF lub [^ D] w większości środowisk.
@user: Przetestuj. Zdecydowanie najwolniejsza część będzie odczytywać plik z dysku.
sarnold
11
@ user1286528, a następnie użyj, wc -l < file.txtaby uniknąć niepotrzebnego używania cat. Chociaż jesteś absolutnie szalony, jeśli myślisz, że pochłania to zauważalny czas.
Otrzymuję błędy składniowe z tym (Ubuntu 14.04). Myślę, że wystąpił problem z nazwą pliku.
MERose,
W RHEL 6.7 powoduje to błędy: $ wc -l plik.csv | bc (standard_in) 1: błąd składni (standard_in) 1: niedozwolony znak: N (standard_in) 1: błąd składni (standard_in) 1: błąd składni
Rodrigo Hjort
3
Otrzymuję również błąd analizy, ale możesz połączyć to z inną odpowiedzią, wc -l < file.txtaby naprawić błąd analizy i usunąć spację:wc -l < file.txt | bc
jangosteve
11
Co powiesz na
wc -l file.txt | cut -d' '-f1
tzn. potokuj wyjście wcdo cut(gdzie ograniczniki są spacjami i wybierz tylko pierwsze pole)
to nie jest lepsze niż wc -l file.txt | awk '{print $1}'próbował OP.
doubleDown
1
Szybciej niż wc -l < file.txtmetoda. Ale musi być używany | cut -d' ' -f2w BSD, o ile wcpolecenie zwraca początkową spację, na przykład: „34068289 plik.txt” zamiast „34068289 plik.txt”.
Sopalajo de Arrierez
@doubleDown, używanie awk jest jak używanie maszyny CNC do cięcia deski zamiast piły. Użyj piły do piłowania.
Peter - Przywróć Monikę
5
Porównanie technik
Miałem podobny problem, próbując uzyskać liczbę znaków bez wiodących białych znaków dostarczonych przez wc, co doprowadziło mnie do tej strony. Po wypróbowaniu odpowiedzi tutaj, oto wyniki moich osobistych testów na komputerze Mac (BSD Bash). Ponownie dotyczy to liczby znaków; dla liczby linii, którą byś zrobił wc -l. echo -npomija koniec linii końcowej.
Nie polegałbym na tej cut -f*metodzie w ogóle, ponieważ wymaga ona znajomości dokładnej liczby wiodących spacji, które może mieć dane wyjście. A ten grepsłuży do liczenia wierszy, ale nie znaków.
bcjest najbardziej zwięzły awki perlwydaje się nieco przesadzony, ale wszystkie powinny być stosunkowo szybkie i wystarczająco przenośne.
Zauważ również, że niektóre z nich można dostosować do przycinania otaczających białych znaków z ogólnych ciągów znaków (razem z echo `echo $FOO`inną fajną sztuczką).
echo $(printf '%s' "$FOO" | wc -c)jest jednym z rzadkich przypadków, gdy echopodmiana polecenia nie jest bezużyteczna.
tripleee
@tripleee Whoa ... w oparciu o Twój kod echo `echo $FOO`;działa również jak polecenie String.trim () na zmiennej! To niezwykle przydatne. Dodam również twoją linię do mojej odpowiedzi.
Miły. Bardzo oryginalne / kreatywne użycie, grepale po sprawdzeniu tego okazuje się (nie jest zaskakujące), że jest 2x do 6x wolniejsze niż prostsza / nieskomplikowana wcmetoda w moich testach.
arielf
3
Oczywiście istnieje wiele rozwiązań tego problemu. Oto jednak inny:
wc -l < file.txt
wykonuje pracę precyzyjnie i zwięźle.Odpowiedzi:
Spróbuj w ten sposób:
źródło
wc -l
nie powinien emitować jednego i dlaczego ksh miałby poprzedzać standardowe wyjście programu spacją?4711 [stdin]
jak wyjście.printf "%'d"
, które zajmuje się przestrzenią i ładnie drukuje duże liczby.Zgodnie ze stroną podręcznika (dla wersji BSD nie mam wersji GNU do sprawdzenia):
źródło
wc -l < file.txt
ma ten sam efekt.wc -l < file.txt
aby uniknąć niepotrzebnego używania cat. Chociaż jesteś absolutnie szalony, jeśli myślisz, że pochłania to zauważalny czas.Aby to zrobić bez wiodącej spacji, dlaczego nie:
źródło
wc -l < file.txt
aby naprawić błąd analizy i usunąć spację:wc -l < file.txt | bc
Co powiesz na
tzn. potokuj wyjście
wc
docut
(gdzie ograniczniki są spacjami i wybierz tylko pierwsze pole)źródło
wc -l file.txt | awk '{print $1}'
próbował OP.wc -l < file.txt
metoda. Ale musi być używany| cut -d' ' -f2
w BSD, o ilewc
polecenie zwraca początkową spację, na przykład: „34068289 plik.txt” zamiast „34068289 plik.txt”.Porównanie technik
Miałem podobny problem, próbując uzyskać liczbę znaków bez wiodących białych znaków dostarczonych przez
wc
, co doprowadziło mnie do tej strony. Po wypróbowaniu odpowiedzi tutaj, oto wyniki moich osobistych testów na komputerze Mac (BSD Bash). Ponownie dotyczy to liczby znaków; dla liczby linii, którą byś zrobiłwc -l
.echo -n
pomija koniec linii końcowej.Nie polegałbym na tej
cut -f*
metodzie w ogóle, ponieważ wymaga ona znajomości dokładnej liczby wiodących spacji, które może mieć dane wyjście. A tengrep
służy do liczenia wierszy, ale nie znaków.bc
jest najbardziej zwięzłyawk
iperl
wydaje się nieco przesadzony, ale wszystkie powinny być stosunkowo szybkie i wystarczająco przenośne.Zauważ również, że niektóre z nich można dostosować do przycinania otaczających białych znaków z ogólnych ciągów znaków (razem z
echo `echo $FOO`
inną fajną sztuczką).źródło
echo $(printf '%s' "$FOO" | wc -c)
jest jednym z rzadkich przypadków, gdyecho
podmiana polecenia nie jest bezużyteczna.echo `echo $FOO`;
działa również jak polecenie String.trim () na zmiennej! To niezwykle przydatne. Dodam również twoją linię do mojej odpowiedzi.printf
lepsze niżecho
?Co powiesz na
źródło
grep
ale po sprawdzeniu tego okazuje się (nie jest zaskakujące), że jest 2x do 6x wolniejsze niż prostsza / nieskomplikowanawc
metoda w moich testach.Oczywiście istnieje wiele rozwiązań tego problemu. Oto jednak inny:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Ten wysyła tylko liczbę wierszy, ale charakter kroczący nowej linii (
\n
) jest obecny, jeśli nie chce, że albo wymienić[:blank:]
z[:space:]
.źródło
test9
zawierającego 1 linię wynik będzie wynosił 19.Najlepszym sposobem byłoby przede wszystkim znalezienie wszystkich plików w katalogu, a następnie użycie AWK NR (Zmienna liczby rekordów)
poniżej znajduje się polecenie:
przykład: -
find /tmp/ -type f | awk 'END{print NR}'
źródło
Działa to w przypadku mnie, używając normalnego
wc -l
ised
usuwania wszelkich znaków, które nie są liczbą.źródło