Chciałbym znaleźć numer najdłuższej linii z pliku.
Na przykład, jeśli mam plik o następującej treści:
lalala
tatatata
abracadabra
mu mu mu
jak mogę napisać skrypt bash, który da mi wynik podobny do tego 3 -> abracadabra:?
Chciałbym znaleźć numer najdłuższej linii z pliku.
Na przykład, jeśli mam plik o następującej treści:
lalala
tatatata
abracadabra
mu mu mu
jak mogę napisać skrypt bash, który da mi wynik podobny do tego 3 -> abracadabra:?
Odpowiedzi:
Nie potrzebujesz do tego skryptu. Wystarczy proste polecenie:
egrep -n "^.{$(wc -L < filename)}$" filename
Działa to nawet wtedy, gdy masz dwie lub więcej linii o tej samej maksymalnej długości.
Jeśli chcesz, aby wynik był dokładnie w tej formie 3 -> abracadabra:, użyj:
egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
Bibliografia:
-C 3Do opcji grep, aby uzyskać kilka linii przed i po dla kontekstu
Możesz użyć awkdo wydrukowania długości każdej linii ( length()) i numeru linii ( NR), a następnie odwrócić ( -r) sortwynik według liczby ( -n):
$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala
Aby wyświetlić tylko pierwszą linię:
$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr
wc -L, nie wiedziałem o tym argumencie. Jest to bardzo przydatne.
AO (N) można osiągnąć za pomocą wkładki perl one:
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
zastosowania (gdzie machin to nazwa pliku)
cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
lub
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin
lub (mniej wyraźny, ale krótszy)
perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin
Odpowiedź Radu jest całkowicie wystarczająca i preferowana, chociaż jeśli chcesz bardziej jednoznacznego rozwiązania opartego na powłoce, możesz użyć następującego skryptu:
#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
if [ "${#line}" -gt "${longest_length}" ]
then
longest_length="${#line}"
longest_string="$line"
fi
done < "$1"
echo "${longest_string}"
Stosowanie: ./find_longest.sh input.txt
Przykład:
$ cat input.txt
1 2
2 3 a a a a
4 5 6
1 1 1 5
$ ./find_longest.sh input.txt
2 3 a a a a
^) a końcem ($) ma dokładnie n znaków (.{n}). Potem musi tylko znaleźć n: do tego używa GNU-ism, „wc -L nazwa pliku” (zauważ, że to nie jest posiks), który zwraca długość najdłuższej linii nazwy pliku. Więc grepuje każdą linię, która ma najdłuższą długość.$(cmd)zastępuje się wynikiemcmd.