znajdź długość najdłuższej linii we wszystkich plikach tekstowych w katalogu

16

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?

głupkowaty
źródło

Odpowiedzi:

11

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 .txtpliki 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 * .*.

lgeorget
źródło
Albo, zapewne cat * .* | .... Lub wyeliminuj niepotrzebne użycie kota i powiedz awk '...' * .*.
G-Man mówi „Reinstate Monica”
@ G-Man Rzeczywiście. Edytowałem swoją odpowiedź na ten temat, kiedy skomentowałeś. :-) Powiedziałem najprościej, ponieważ łączenie plików z cat jest z początku prostsze.
lgeorget
4

Z GNU wc:

cat *.txt|wc -L

-L wypisuje długość najdłuższej linii.

Lri
źródło
4

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.

Stéphane Chazelas
źródło
Są to pliki tekstowe, więc kończą się znakami nowej linii (chyba że są puste).
Gilles „SO- przestań być zły”
0

Również z GNU wc (coreutils 8.4), może obsługiwać wiele plików

wc -L *.txt
  • wyświetla długość każdego pojedynczego pliku
  • a także zapewnić najdłuższą długość wszystkich plików
Francis W.
źródło
Jest to zasadniczo to, co robi ta inna wzmianka o odpowiedziwc -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ę?
Anthon