Я шукаю простий спосіб знайти довжину найдовшого рядка у файлі. В ідеалі це була б проста команда bash shell замість сценарію.
Я шукаю простий спосіб знайти довжину найдовшого рядка у файлі. В ідеалі це була б проста команда bash shell замість сценарію.
Відповіді:
Використання wc (GNU coreutils) 7.4:
wc -L filename
дає:
101 filename
-L
залежить від місцевості. Деякі символи (і в байтовому, і в багатобайтовому сенсі) можуть взагалі не рахуватися!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
є у coreutils
формулі, яка встановлює всі основні програми GNU з g
префіксом.
awk '{print length, $0}' Input_file |sort -nr|head -1
Для довідки: Пошук найдовшого рядка у файлі
END{}
блоку.
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
awk 'length>max{max=length}END{print max}' file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Тільки для розваги та навчальних цілей, чисте рішення оболонки POSIX , без марного використання кота та без прив’язки до зовнішніх команд. Приймає ім'я файлу як перший аргумент:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
його можна легко прочитати з stdin. З тестом для $#
цього навіть могли обійтися, залежно від кількості арг. Просто в цьому світі немає потреби в непотрібних котів. Новачок слід навчати відповідно з самого початку.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Друкує довжину, номер рядка та вміст найдовшого рядка
perl -ne 'print length()." line $. $_"' myfile | sort -n
Друкує відсортований список усіх рядків із номерами рядків та довжинами
.
є оператором конкатенації - він використовується тут після length ()
$.
- номер поточного рядка
$_
- поточний рядок
wc -L
найкраще рішення, яке я бачив досі.
wc -L
тривало 3 секунди
wc -L
просто порахуйте записи чисел - цей Q збирався знайти найдовший рядок - не зовсім однаковий, тому це не точне порівняння.
Важливий занедбаний момент у наведених вище прикладах.
Наступні 2 приклади рахують розширені вкладки
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Наступні 2 рахують нерозгорнуті вкладки.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
так
Expanded nonexpanded
$'nn\tnn' 10 5
Здається, у відповідь не дайте номер рядка найдовшого рядка. Наступна команда може дати номер рядка і приблизно довжину:
$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11
awk '{print length}' test.txt | sort -rn | head -1
. Якщо вам також потрібен власний вміст рядка, awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Ось довідники візитника
cat filename | awk '{print length, $0}'|sort -nr|head -1
Просто для задоволення, ось версія Powershell:
cat filename.txt | sort length | select -last 1
А щоб просто отримати довжину:
(cat filename.txt | sort length | select -last 1).Length
sort
взяти filename.txt як аргумент? Тоді кішка марна, оскільки sort length filename.txt | select -last 1
уникає труби і процесу, який просто копіює дані навколо.
Я перебуваю в середовищі Unix і працюю з gzipped файлами розміром у кілька ГБ. Я перевірив наступні команди, використовуючи gzipped файл 2 Гб із довжиною запису 2052.
zcat <gzipped file> | wc -L
і
zcat <gzipped file> | awk '{print length}' | sort -u
Часи були на очах
117 секунд
109 секунд
Ось мій сценарій приблизно через 10 запусків.
START=$(date +%s) ## time of start
zcat $1 | wc -L
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
START=$(date +%s) ## time of start
zcat $1 | awk '{print length}' | sort -u
END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
awk
версія отримує користь від кешування блоків диска wc
версії, яка працює першою (і закладає кеш диска). Вам доведеться рандомізувати порядок того, хто викликається першим протягом десяти циклів, щоб зробити цей аргумент незмінним.
Варіація на тему.
Цей покаже всі рядки, що мають довжину найдовшого рядка, знайденого у файлі, зберігаючи порядок, який вони відображаються у джерелі.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Так мій файл
x
mn
xyz
123
abc
дасть
xyz
123
abc
Якщо ви використовуєте MacOS і отримуєте цю помилку:
wc: illegal option -- L
вам не потрібно встановлювати GNU sipmly, зробіть це.
Якщо все, що ви хочете зробити, це просто отримати кількість символів у найдовшому рядку файлу, і ви використовуєте OS X run:
awk '{print length}' "$file_name" | sort -rn | head -1
Щось на зразок цього;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Виходи:
The longest line in the file my_file has 117 characters
-c -l -m -w
варіанти є POSIX.-L
є GNUism.