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 -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.
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.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:
wc -l < file.txt | bc
wc -l < file.txt
aby 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 wc
do cut
(gdzie ograniczniki są spacjami i wybierz tylko pierwsze pole)
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 ile wc
polecenie 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 -n
pomija 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 grep
służy do liczenia wierszy, ale nie znaków.
bc
jest najbardziej zwięzły awk
i perl
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ą).
echo $(printf '%s' "$FOO" | wc -c)
jest jednym z rzadkich przypadków, gdy echo
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
?
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:]
.
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:
find <directory path> -type f | awk 'END{print NR}'
przykład: - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
wykonuje pracę precyzyjnie i zwięźle.