Мне интересно узнать номер самой длинной строки из файла.
Например, если у меня есть файл со следующим содержимым:
lalala
tatatata
abracadabra
mu mu mu
, как мне написать скрипт bash, который выдаст мне что-то вроде этого: 3 -> abracadabra
?
Вам не нужен сценарий для этого. Достаточно простой команды:
egrep -n "^.{$(wc -L < filename)}$" filename
Это сработает, даже если у вас две или более строки одинаковой максимальной длины.
Если вы хотите, чтобы выходные данные были точно в этой форме: 3 -> abracadabra
, то используйте:
egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'
Ссылки:
Вы могли использовать awk
распечатать длину каждой строки (length()
) и номер строки (NR
), затем инвертируйте (-r
) sort
результат числом (-n
):
$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala
Показать просто первую строку:
$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr
O (N) может быть достигнут с жемчугом один лайнер:
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
использования (где машина является именем файла),
cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'
или
perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin
или (менее ясный, но короче)
perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin
O (n) Для машин, например, OpenWRT, где жемчуг не доступен, @awk версия, мог бы быть полезным.
awk 'length > l {l=length;line=$0} END {print line}' FILE
или Python:
python -c "print max(open('$file', 'r'), key=len)"
Ответ Раду вполне достаточен и предпочтителен, хотя, если вы хотите более явное и основанное на оболочке решение, вы можете использовать следующий скрипт:
#!/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}"
Использование: ./find_longest.sh input.txt
Пример:
$ 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