Czy istnieje sposób na uzyskanie liczby całkowitej zwracanej przez wc w bash?
Zasadniczo chcę zapisać numery wierszy i liczbę słów na ekranie po nazwie pliku.
output: filename linecount wordcount
Oto, co mam do tej pory:
files=`ls`
for f in $files;
do
if [ ! -d $f ] #only print out information about files !directories
then
# some way of getting the wc integers into shell variables and then printing them
echo "$f $lines $ words"
fi
done
cut
pracować nad pełnym wyjściem,wc $f
ponieważ liczba spacji między polami jest różna.Najprostsza odpowiedź w historii:
źródło
wc -c < file name
, otrzymasz tylko całkowitą liczbę bajtów i nic więcej.Właśnie:
wykona robotę. Ale te dane wyjściowe zawierają przedrostki białe spacje, które
wc
wyrównują liczbę do prawej.źródło
wc -l < foo.txt | xargs
ref - stackoverflow.com/a/12973694/149428lines=`wc -l < $f`
daje w wyniku zmienną „line”, której wartość nie zawiera spacji wiodących.find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l
działa poprawnie, ale wyświetla każdy plik. Jeśli używamfind . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <
, pojawia się błąd.parse error near '\n'
Dostosuj w razie potrzeby do swojego układu.
Ładniej jest też używać logiki pozytywnej („jest plikiem”) zamiast wartości ujemnej („nie jest katalogiem”)
źródło
wc $file | awk '{print $4" "$2" "$1}'
- apostrofy poza{}
.Czasami wyjścia wc w różnych formatach na różnych platformach. Na przykład:
W OS X:
W Centos:
Więc użycie tylko cięcia może nie odzyskać numeru. Zamiast tego spróbuj tr, aby usunąć znaki spacji:
źródło
Zaakceptowane / popularne odpowiedzi nie działają w systemie OSX.
Każde z poniższych powinno być przenośne w systemach bsd i linux.
LUB
LUB
źródło
Jeśli przekierujesz do niego nazwę pliku
wc
, pomija nazwę pliku na wyjściu.Grzmotnąć:
lub
Zamiast używać
for
do iteracji po danych wyjściowychls
, wykonaj następujące czynności:co zadziała, jeśli istnieją nazwy plików zawierające spacje.
Jeśli nie możesz użyć globbingu, powinieneś potokować do
while read
pętli:lub użyj zastępowania procesu
źródło
read lines words characters filename <<< $(wc "$f")
Aha, i jeśli kiedyś * byłeś zabezpieczony przed spacjami, chcesz również podwójnie zacytować var, kiedy go używasz.$f
w tym przypadku), jest to niepotrzebne. Ponadto OP zapytał, jak uzyskać tylko liczbę całkowitą. Masz rację, jeśli chodzi o cytowanie zmiennej, ale nie pokazałem użycia zmiennej, więc pominąłem wzmiankę o tym.for f in *
Forma powinna być prawie zawsze stosowany zamiast używania wyjścials
, jak wiesz.ls
. To da ci nagrodę. partmaps.org/era/unix/award.html#lsread lines words characters _ <<< $(wc "$f")
$_
jest po prostu inną zmienną.Jeśli plik jest mały, możesz pozwolić sobie na
wc
dwukrotne wywołanie i użycie czegoś podobnego do poniższego, co pozwala uniknąć przekierowania do dodatkowego procesu:Jest
$((...))
to arytmetyczne rozszerzenie bash. Wwc
tym przypadku usuwa wszelkie spacje z danych wyjściowych programu .Takie rozwiązanie sprawia, że więcej sensu, jeśli trzeba albo się linecount lub z WordCount.
źródło
A co powiesz na to
sed
?źródło
źródło
Spróbuj tego dla wyniku liczbowego:
nlines = $ (wc -l <$ myfile)
źródło
Spróbuj tego:
Tworzy liczbę wierszy i liczbę słów (LINE i WC), a następnie zwiększa je o wartości wyodrębnione z wc (używając 1 $ za wartość pierwszej kolumny i 2 $ za drugą), a na końcu drukuje wyniki.
źródło
Wyniki: linie myfile.txt: 10 słów: 20 bajtów: 120
źródło
źródło
perl
mimo wszystko używasz , równie dobrze możesz policzyć słowa w Perlu. Bardziej ekonomicznie podejście byłoby rurytr -d '[:space:]'