ฉันกำลังมองหาวิธีง่ายๆในการค้นหาความยาวของบรรทัดที่ยาวที่สุดในไฟล์ เป็นการดีที่มันจะเป็นคำสั่ง bash shell อย่างง่าย ๆ แทนที่จะเป็นสคริปต์
ฉันกำลังมองหาวิธีง่ายๆในการค้นหาความยาวของบรรทัดที่ยาวที่สุดในไฟล์ เป็นการดีที่มันจะเป็นคำสั่ง bash shell อย่างง่าย ๆ แทนที่จะเป็นสคริปต์
คำตอบ:
ใช้ wc (coreutils GNU) 7.4:
wc -L filename
ให้:
101 filename
-L
ขึ้นอยู่กับสถานที่ ตัวละครบางตัว (ทั้งในแบบไบท์และแบบมัลติไบต์) อาจไม่ถูกนับ!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
อยู่ในcoreutils
สูตรซึ่งติดตั้ง 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 ด้วยการทดสอบ$#
ก็สามารถทำได้ทั้งสองอย่างขึ้นอยู่กับจำนวนของ args ไม่มีความจำเป็นสำหรับแมวที่ไร้ประโยชน์ในโลกนี้ มือใหม่ควรได้รับการสอนอย่างถูกต้องตั้งแต่ต้น
longest < /usr/share/dict/words
wc -L < filename
จะช่วยให้
101
wc
จากการแสดงผลชื่อไฟล์ :)
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
พิมพ์ความยาวหมายเลขบรรทัดและเนื้อหาของบรรทัดที่ยาวที่สุด
perl -ne 'print length()." line $. $_"' myfile | sort -n
พิมพ์รายการที่เรียงลำดับของทุกบรรทัดพร้อมหมายเลขบรรทัดและความยาว
.
เป็นตัวดำเนินการเรียงต่อกัน - มันถูกใช้ที่นี่หลังจากความยาว ()
$.
คือหมายเลขบรรทัดปัจจุบัน
$_
คือบรรทัดปัจจุบัน
wc -L
เป็นทางออกที่ดีที่สุดที่ฉันเห็น
wc -L
ใช้เวลา 3 วินาที
wc -L
เพียงนับจำนวนระเบียน - คำถามนี้กำลังจะหา เส้นที่ยาวที่สุด - ไม่เหมือนกันดังนั้นจึงไม่ใช่การเปรียบเทียบที่แม่นยำ
จุดที่มองข้ามที่สำคัญในตัวอย่างด้านบน
ตัวอย่าง 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
ใน Perl:
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
sort
ใช้ filename.txt เป็นอาร์กิวเมนต์ได้หรือไม่ จากนั้นแมวก็ไร้ประโยชน์เพราะsort length filename.txt | select -last 1
หลีกเลี่ยงการไปป์และกระบวนการที่เพิ่งคัดลอกข้อมูลไปรอบ ๆ
ฉันอยู่ในสภาพแวดล้อม Unix และทำงานกับไฟล์ gzipped ที่มีขนาดไม่กี่ GB ฉันทดสอบคำสั่งต่อไปนี้โดยใช้ไฟล์ 2 GB gzipped ที่มีความยาวเรคคอร์ด 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
ดังนั้น myfile
x
mn
xyz
123
abc
จะให้
xyz
123
abc
หากคุณใช้ MacOS และได้รับข้อผิดพลาดนี้:
wc: illegal option -- L
คุณไม่จำเป็นต้องติดตั้ง GNU sipmly ทำเช่นนี้
หากสิ่งที่คุณต้องการทำคือรับจำนวนตัวอักษรในบรรทัดที่ยาวที่สุดของไฟล์และคุณใช้ OS X รัน:
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