الحصول على طول أطول خط في ملف
سؤال
أبحث عن طريقة بسيطة للعثور على طول خط أطول في ملف. من الناحية المثالية، سيكون الأمر أمرا بسيطا باش شل بدلا من برنامج نصي.
المحلول
باستخدام WC (GNU COREUTILS) 7.4:
wc -L filename
يعطي
101 filename
نصائح أخرى
awk '{print length, $0}' Input_file |sort -nr|head -1
كمرجع : العثور على خط أطول في ملف
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
فقط للمتعة والغرض التعليمي، حل قذيفة بوسيكس نقية, ، دون استخدام القطة عديمة الفائدة ولا تشفر بأوامر خارجية. يأخذ اسم الملف كوسيطة الأولى:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
wc -L < filename
اعطي
101
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
يطبع الطول ورقم الخط ومحتويات خط أطول
perl -ne 'print length()." line $. $_"' myfile | sort -n
يطبع قائمة مرتبة من جميع الخطوط، مع أرقام الخطوط والأطوال
.
هو مشغل التسلسل - يتم استخدامه هنا بعد الطول ()
$.
هو رقم الخط الحالي
$_
هو الخط الحالي
نقطة مهملة مهمة في الأمثلة أعلاه.
2 الأمثلة التالية عدد علامات التبويب الموسعة
wc -L <"${SourceFile}"
# or
expand --tabs=1 "${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
في بيرل:
perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1
هذا يطبع فقط الخط، وليس طوله أيضا.
فيما يلي مراجع Anwser
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
أنا في بيئة UNIX، والعمل مع الملفات Gzpeced التي هي قليلة gbs في الحجم. اختبرت الأوامر التالية باستخدام ملف 2 غيغابايت gzpeced مع طول سجل 2052.
zcat <gzipped file> | wc -L
و
zcat <gzipped file> | awk '{print length}' | sort -u
كانت الأوقات في avarage
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"
تباين على السمة.
هذا واحد سوف تظهر الكل خطوط تحتوي على طول أطول خط موجود في الملف، الاحتفاظ بالترتيب الذي تظهر به في المصدر.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
myfile
x
mn
xyz
123
abc
سنعطي
xyz
123
abc