Wiem, jak uzyskać długość najdłuższej linii w pliku tekstowym za pomocą awk
awk ' { if ( length > L ) { L=length} }END{ print L}' file.txt
ale jak mogę uzyskać długość najdłuższej linii wszystkich plików w katalogu?
Wiem, jak uzyskać długość najdłuższej linii w pliku tekstowym za pomocą awk
awk ' { if ( length > L ) { L=length} }END{ print L}' file.txt
ale jak mogę uzyskać długość najdłuższej linii wszystkich plików w katalogu?
Odpowiedzi:
Najprostszym rozwiązaniem jest połączenie wszystkich plików i przesłanie wyniku do skryptu:
cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'
Możesz także przekazać bezpośrednio kilka plików do awk:
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*
Oczywiście mogą istnieć pewne ostrzeżenia, jeśli pliki są w rzeczywistości katalogami, ale powinny być nieszkodliwe. Możesz mieć większe problemy z plikami binarnymi, ponieważ nie mają one pojęcia linii . Aby być bardziej szczegółowym, możesz zrobić coś takiego
awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt
aby dopasować tylko .txt
pliki w bieżącym katalogu.
I, jak stwierdził @ G-Man w swoim komentarzu, *
nie będzie pasował do ukrytych plików (zaczynając od kropki). Jeśli chcesz, użyj * .*
.
Jeśli chcesz maksymalną długość pliku, z GNU awk:
find . -type f -exec awk -v l=0 '
length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +
Lub jedna maksymalna długość we wszystkich plikach:
find . -type f -size +1c -exec cat {} + |
awk -v l=0 'length>l {l=length}; END{print l}'
To zakłada, że pliki kończą się znakami nowej linii. Jeśli jeden plik nie kończy się znakiem nowej linii, to jego ostatnia nie rozdzielana linia zostanie scalona z pierwszą linią następnego pliku i prawdopodobnie unieważni twój wynik.
-size +1c
jest optymalizacją, ponieważ pliki tekstowe, które są puste lub zawierają tylko jeden znak, mają odpowiednio 0 linii i 1 pustą linię, więc nie będą miały najdłuższej linii.
Również z GNU wc (coreutils 8.4), może obsługiwać wiele plików
wc -L *.txt
wc -L
, ale twoje rozwiązanie ma tę wadę, że musisz najpierw przejść przez maksymalną długość wszystkich innych plików. Czy ma to jakąś zaletę?
cat * .* | ...
. Lub wyeliminuj niepotrzebne użycie kota i powiedzawk '...' * .*
.