wc -l file.txt
wyświetla liczbę linii i nazwę pliku.
Potrzebuję tylko samego numeru (nie nazwy pliku).
mogę to zrobić
wc -l file.txt | awk '{print $1}'
Ale może jest lepszy sposób?
wc -l file.txt
wyświetla liczbę linii i nazwę pliku.
Potrzebuję tylko samego numeru (nie nazwy pliku).
mogę to zrobić
wc -l file.txt | awk '{print $1}'
Ale może jest lepszy sposób?
Odpowiedzi:
Spróbuj w ten sposób:
wc -l < file.txt
wc -lnie 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.
cat file.txt | wc -l
Zgodnie ze stroną podręcznika (dla wersji BSD nie mam wersji GNU do sprawdzenia):
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.
wc -l < file.txtma ten sam efekt.
wc -l < file.txtaby 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:
wc -l < file.txt | bc
wc -l < file.txtaby naprawić błąd analizy i usunąć spację:wc -l < file.txt | bc
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)
wc -l file.txt | awk '{print $1}'próbował OP.
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”.
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.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
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.
echo `echo $FOO`;działa również jak polecenie String.trim () na zmiennej! To niezwykle przydatne. Dodam również twoją linię do mojej odpowiedzi.
printflepsze niż echo?
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:].
test9zawierają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:
find <directory path> -type f | awk 'END{print NR}'
przykład: - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txtwykonuje pracę precyzyjnie i zwięźle.