سؤال

أبحث عن طريقة بسيطة للعثور على طول خط أطول في ملف. من الناحية المثالية، سيكون الأمر أمرا بسيطا باش شل بدلا من برنامج نصي.

هل كانت مفيدة؟

المحلول

باستخدام 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

http://wtanaka.com/node/7719.

فقط للمتعة، إليك نسخة PowerShell:

cat filename.txt | sort length | select -last 1

وللحصول فقط على الطول:

(cat filename.txt | sort length | select -last 1).Length

أنا في بيئة UNIX، والعمل مع الملفات Gzpeced التي هي قليلة gbs في الحجم. اختبرت الأوامر التالية باستخدام ملف 2 غيغابايت gzpeced مع طول سجل 2052.

  1. zcat <gzipped file> | wc -L

و

  1. zcat <gzipped file> | awk '{print length}' | sort -u

كانت الأوقات في avarage

  1. 117 ثانية

  2. 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top