Załóżmy, że mam plik tekstowy jak poniżej
abcd
aaaaaaa
gfgk
hahahahahahhahh
gf
Wtedy gf
zostaną zwrócone. Jakieś dobre pomysły?
Zakładając, że każda z linii zawiera „słowo” znaków,
i nie mamy nic przeciwko temu, aby powłoka wykonała trochę więcej pracy,
oto rozwiązanie AWK.
# Niech twój tekst będzie w `str.txt` awk '{długość wydruku (1 $), 1 $}' str.txt | sort -nk 1 | głowa -1 # Wyjście: 2 gf ## Który jest najkrótszym ciągiem
Możesz to zoptymalizować, aby uniknąć sortowania za pomocą większej ilości AWK.
Możesz dostosować to jeszcze bardziej, jeśli masz więcej niż jedno „słowo” w wierszu.
Pamiętaj również, że jeśli masz wiele najkrótszych ciągów, da ci to jeden z nich.
Możesz też zrobić więcej sztuczek, aby je zdobyć.
$0
(pełna linia) zamiast$1
(pierwsze pole).$1
powróci tylko do pierwszej białej spacji. Przykład SpawnST nie ma żadnych spacji, więc albo działałby, gdyby jego prawdziwy plik danych był taki sam.Awk jest do tego świetny:
Pierwsza część ustawia „najkrótszą” zmienną na bieżącą linię, jeśli jest to pierwsza linia lub jeśli długość jest krótsza niż poprzednio najkrótsza linia. Wreszcie ostatnia część wypisuje wartość najkrótszego.
źródło
BASH wpis nr 1 mówi, jak czytać plik linia po linii.
${#foo}
da ci długość$foo
. Wystarczy zapętlić, testując kolejno każdą linię.źródło
Rozwiązanie wykorzystujące sed i utrzymujące pierwszą najkrótszą linię z pliku:
Aby zachować ostatnią najkrótszą linię z pliku:
Poniżej znajduje się wyjaśniona wersja 1. najkrótszej linii w postaci pliku skryptu sed, który można uruchomić za pomocą
sed -f script your_file
:źródło
Oto moja dość niezdarna oferta za pomocą Perla:
Nieco łatwiej: perl -ne '$ l = $ _ if $. == 1; $ l = $ _ jeśli długość ($ ) <długość ($ l); END {print $ l;} 'plik ### najkrótszy perl -ne' $ l = $ if $. == 1; $ l = $ _ jeśli długość ($ _)> długość ($ l); END {print $ l;} 'najdłużej plik ###
grep plik | perl -ne '$ l = $ _ if $. == 1; $ l = $ _ jeśli długość ($ _) <długość ($ l); END {print $ l;} '## najkrótsze usunięcie możliwych pustych linii
grep plik | perl -ne '$ l = $ _ if $. == 1; $ l = $ _ jeśli długość ($ _) <długość ($ l); END {print $ l;} '## najdłużej usuwając możliwe puste linie
źródło