บรรทัดที่ยาวที่สุดในไฟล์


200

ฉันกำลังมองหาวิธีง่ายๆในการค้นหาความยาวของบรรทัดที่ยาวที่สุดในไฟล์ เป็นการดีที่มันจะเป็นคำสั่ง bash shell อย่างง่าย ๆ แทนที่จะเป็นสคริปต์

คำตอบ:


272

ใช้ wc (coreutils GNU) 7.4:

wc -L filename

ให้:

101 filename

56
โปรดทราบว่าเฉพาะตัว-c -l -m -wเลือกที่เป็น POSIX -Lเป็น GNUism
เจนส์

4
โปรดทราบว่าผลลัพธ์ของการ-Lขึ้นอยู่กับสถานที่ ตัวละครบางตัว (ทั้งในแบบไบท์และแบบมัลติไบต์) อาจไม่ถูกนับ!
วอลเตอร์ Tross

7
OS X:wc: illegal option -- L usage: wc [-clmw] [file ...]
Hugo

12
OS X: ใช้ homebrew ใช้ gwc สำหรับ GNU Word Count gwc -L ชื่อไฟล์
kaycoder

3
@xaxxon gwcอยู่ในcoreutilsสูตรซึ่งติดตั้ง coreutils GNU ทั้งหมดพร้อมด้วยgคำนำหน้า
gsnedders

100
awk '{print length, $0}' Input_file |sort -nr|head -1

สำหรับการอ้างอิง: การค้นหาบรรทัดที่ยาวที่สุดในไฟล์


12
ทำไมคำสั่ง cat พิเศษ? เพียงให้ชื่อไฟล์โดยตรงเป็นอาร์กิวเมนต์เพื่อ awk
Thomas Padron-McCarthy

18
@Thomas การแสดงว่าเป็นไพพ์จะกว้างกว่าการระบุไฟล์เป็นตัวเลือก ในกรณีของฉันฉันจะใช้ output piped จากแบบสอบถามฐานข้อมูล
Andrew Prock

1
อันนี้เป็นคำตอบที่ดีที่สุดเพราะมันเป็น POSIX (ดีกว่าทำงานบน OS X)
MK

5
@MK อย่างไรก็ตามวิธีนี้คือ O (n * log (n)) ในจำนวนบรรทัดในขณะที่วิธีการของ Ramon คือ O (n)
jub0bs

2
การเรียงลำดับไฟล์ขนาดใหญ่อาจใช้เวลาหลายชั่วโมงในการดำเนินการให้เสร็จสมบูรณ์และใช้พื้นที่กิกะไบต์แม้กระทั่งเทราไบต์ของพื้นที่ชั่วคราวขึ้นอยู่กับขนาดไฟล์อินพุต พิจารณาจัดเก็บความยาวที่ยาวที่สุดและระเบียนที่เกี่ยวข้องจากนั้นพิมพ์จากEND{}บล็อก
Luv2code

67
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 

3
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
ke20

5
awk 'length>max{max=length}END{print max}' file
Chris Seymour

8
คำตอบนี้ให้ข้อความของบรรทัดที่ยาวที่สุดในไฟล์มากกว่าความยาว ฉันปล่อยให้มันเป็น - แม้ว่าคำถามจะถามความยาวเพราะฉันสงสัยว่ามันจะมีประโยชน์สำหรับคนที่มาที่หน้านี้เพียงแค่ดูที่ชื่อ
Ramon

3
ง่ายต่อการนับโดยใช้ WC ..awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
นิค

1
คุณกรุณาช่วยอธิบายว่ามันใช้งานได้อย่างไร?
Lnux

23

เพื่อความสนุกสนานและเพื่อการศึกษาโซลูชั่นเชลล์ POSIX บริสุทธิ์โดยไม่ต้องใช้แมวและไม่ต้องใช้คำสั่งภายนอก ใช้ชื่อไฟล์เป็นอาร์กิวเมนต์แรก:

#!/bin/sh

MAX=0 IFS=
while read -r line; do
  if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"

6
การไม่สามารถอ่านจาก std in (ผ่าน cat) จะลดยูทิลิตี้ของสิ่งนี้ลง แต่ไม่ช่วยเพิ่ม
Andrew Prock

4
โอพีพูดอย่างชัดเจนว่า "ไฟล์" และถ้าไม่มี< "$1"มันก็สามารถอ่านได้จาก stdin ด้วยการทดสอบ$#ก็สามารถทำได้ทั้งสองอย่างขึ้นอยู่กับจำนวนของ args ไม่มีความจำเป็นสำหรับแมวที่ไร้ประโยชน์ในโลกนี้ มือใหม่ควรได้รับการสอนอย่างถูกต้องตั้งแต่ต้น
เจนส์

7
สิ่งนี้ควรจะได้รับการจัดอันดับให้สูงขึ้นซึ่งเป็นสิ่งที่ผู้ใช้ร้องขอ เพิ่มฟังก์ชั่นที่ยาวที่สุด () {MAX = 0 IFS = ขณะอ่านบรรทัด -r; ทำอย่างไรถ้า [$ {# line} -gt $ MAX]; จากนั้น MAX = $ {# line}; fi เสร็จ echo $ MAX} ไปที่. bashrc ของคุณและคุณสามารถเรียกใช้ได้longest < /usr/share/dict/words
skierpage


11
perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1

พิมพ์ความยาวหมายเลขบรรทัดและเนื้อหาของบรรทัดที่ยาวที่สุด

perl -ne 'print length()."  line $.  $_"' myfile | sort -n

พิมพ์รายการที่เรียงลำดับของทุกบรรทัดพร้อมหมายเลขบรรทัดและความยาว

.เป็นตัวดำเนินการเรียงต่อกัน - มันถูกใช้ที่นี่หลังจากความยาว ()
$.คือหมายเลขบรรทัดปัจจุบัน
$_คือบรรทัดปัจจุบัน


ต้องมีการเรียงลำดับไฟล์ .. ประสิทธิภาพจะแย่มากสำหรับไฟล์ที่มีขนาดปานกลางและจะไม่ทำงานกับไฟล์ที่มีขนาดใหญ่กว่า wc -Lเป็นทางออกที่ดีที่สุดที่ฉันเห็น
Tagar

การใช้ไฟล์ข้อความบรรทัดขนาด 550MB 6,000,000 เป็นแหล่งข้อมูล (British National Corpus) โซลูชัน perl ใช้เวลา 12 วินาทีในขณะที่wc -Lใช้เวลา 3 วินาที
Chris Koknat

wc -L เพียงนับจำนวนระเบียน - คำถามนี้กำลังจะหา เส้นที่ยาวที่สุด - ไม่เหมือนกันดังนั้นจึงไม่ใช่การเปรียบเทียบที่แม่นยำ
Tagar

6

จุดที่มองข้ามที่สำคัญในตัวอย่างด้านบน

ตัวอย่าง 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

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
kakoma

3

ใน Perl:

perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1

นี่พิมพ์เฉพาะบรรทัดไม่ใช่ความยาวเกินไป


3

นี่คือการอ้างอิงของ anwser

cat filename | awk '{print length, $0}'|sort -nr|head -1

http://wtanaka.com/node/7719


1
สคริปต์ awk ที่สองนั้นจะบอกความยาวที่ยาวที่สุดเท่านั้นไม่แสดงบรรทัดที่ยาวที่สุด
rsp

1
มาเลย .. สิ่งเหล่านี้เหมือนกับคำตอบสองข้อแรกที่เพิ่มเข้ามาพร้อมกับข้อมูลอ้างอิง
Pale Blue Dot

@rsp: ฉันฆ่า anwser ตัวที่สอง
ขีดตกต่ำสุด SOUNTEM

2

เพียงเพื่อความสนุกนี่คือรุ่น Powershell:

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

และเพื่อให้ได้ความยาว:

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

4
ดังนั้นแม้แต่โปรแกรมเมอร์ powershell ต้องใช้แมวที่ไร้ประโยชน์?
เจนส์

1
@Jens ไม่แน่ใจว่าฉันเข้าใจคุณแมวใน Powershell เป็นเพียงนามแฝงของ Get-Content ซึ่งพฤติกรรมนั้นขึ้นอยู่กับบริบทและผู้ให้บริการ
eddiegroves

สามารถsortใช้ filename.txt เป็นอาร์กิวเมนต์ได้หรือไม่ จากนั้นแมวก็ไร้ประโยชน์เพราะsort length filename.txt | select -last 1หลีกเลี่ยงการไปป์และกระบวนการที่เพิ่งคัดลอกข้อมูลไปรอบ ๆ
Jens

ในฐานะที่เป็น Sidenote PowerShell คืออะไร? ฉันคิดว่าโปรแกรม powershell ใช้สำหรับเครื่อง windows
แฟรงคลิน

4
@Jens ข้อมูลมักมาจากสตรีมแทนที่จะเป็นชื่อไฟล์ นี่เป็นสำนวนเครื่องมือยูนิกซ์มาตรฐาน
Andrew Prock

2

ฉันอยู่ในสภาพแวดล้อม Unix และทำงานกับไฟล์ gzipped ที่มีขนาดไม่กี่ GB ฉันทดสอบคำสั่งต่อไปนี้โดยใช้ไฟล์ 2 GB gzipped ที่มีความยาวเรคคอร์ด 2052

  1. zcat <gzipped file> | wc -L

และ

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

เวลาอยู่ในความกล้าหาญ

  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"

ฉันไม่แน่ใจว่านี่เป็นการเปรียบเทียบที่ถูกต้องฉันจะเป็นกังวลว่าawkเวอร์ชั่นจะได้รับประโยชน์จากการแคชบล็อกดิสก์ของwcเวอร์ชันที่รันครั้งแรก (และเริ่มการแคชของดิสก์) คุณจะต้องสุ่มลำดับของผู้ที่ได้รับการเรียกก่อนวิ่งสิบครั้งเพื่อให้อาร์กิวเมนต์นี้ติด
Canonical Chris

1

การเปลี่ยนแปลงในชุดรูปแบบ

บรรทัดนี้จะแสดงบรรทัดทั้งหมดที่มีความยาวของบรรทัดที่ยาวที่สุดที่พบในไฟล์โดยรักษาลำดับที่ปรากฏในแหล่งที่มา

FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE

ดังนั้น myfile

x
mn
xyz
123
abc

จะให้

xyz
123
abc

0

หากคุณใช้ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.