Bir dosyadaki en uzun satır


200

Bir dosyadaki en uzun satırın uzunluğunu bulmak için basit bir yol arıyorum. İdeal olarak, bir betik yerine basit bir bash kabuk komutu olurdu.

Yanıtlar:


272

Wc (GNU coreutils) kullanarak 7.4:

wc -L filename

verir:

101 filename

56
Yalnızca -c -l -m -wseçeneklerin POSIX olduğunu unutmayın . -Lbir GNUizmdir.
Jens

4
Ayrıca sonucun -Lyerel ayara bağlı olduğuna dikkat edin. Bazı karakterler (hem bayt hem de çok baytlı anlamda) hiç sayılmayabilir!
Walter Tross

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

12
OS X: homebrew kullanarak, GNU Word Count için gwc kullanın gwc -L dosya adı
kaycoder

3
@xaxxon gwc, coreutilstüm GNU coreutils'lerini bir gönekle yükleyen formüldedir .
gsnedders

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

Başvuru için: Bir dosyadaki en uzun satırı bulma


12
Neden ekstra kedi komutu? Dosya adını doğrudan awk için bir argüman olarak verin.
Thomas Padron-McCarthy

18
@Thomas. Pipo olarak ifade etmek, bir dosyayı seçenek olarak belirtmekten daha geneldir. Benim durumumda, bir veritabanı sorgusu borulu çıkış kullanacağım.
Andrew Prock

1
bu en iyi cevap çünkü daha fazla POSIX (iyi, OS X üzerinde çalışıyor)
MK.

5
@MK. Bununla birlikte, hat sayısında bu yaklaşım O (n * log (n)) iken, Ramon'un yaklaşımı O (n) 'dir.
jub0bs

2
Büyük bir dosyayı sıralamak, giriş dosya boyutuna bağlı olarak terabayt geçici alan bile olsa gigabaytların tamamlanması ve tüketilmesi saatler sürebilir. En uzun uzunluğu ve ilişkili kaydını saklayın, ardından bir END{}bloktan yazdırın .
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
Bu yanıt dosyadaki uzunluğundan ziyade en uzun satırın metnini verir . Soruyu uzunluğunu sormasına rağmen olduğu gibi bırakıyorum, çünkü bu sayfaya sadece başlığa bakarak gelen insanlar için yararlı olacağından şüpheleniyorum.
Ramon

3
WC kullanarak sayıyı almak kolay ..awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
Nick

1
Bunun nasıl çalıştığını açıklar mısınız?
Mart'ta Lnux

23

Sadece eğlence ve eğitim amaçlı, saf POSIX kabuk çözümü , kedinin gereksiz kullanımı ve harici komutlara gerek kalmadan. Dosya adını ilk argüman olarak alır:

#!/bin/sh

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

6
(kedi aracılığıyla) std'den okuyamamak aslında bunun faydasını azaltır, geliştirmez.
Andrew Prock

4
Peki, OP açıkça "dosya" dedi ve onsuz < "$1"kolayca stdin okuyabilirsiniz. Bir testle $#, argüman sayısına bağlı olarak her ikisini de yapabilirdi. Bu dünyada işe yaramaz kedilere gerek yok. Yeni başlayanlar en baştan itibaren buna göre öğretilmelidir.
Jens

7
Bu daha yüksek derecelendirilmelidir, kullanıcının istediği şey budur. En uzun işlevi ekle () {MAX = 0 IFS = -r satırı okunurken; [$ {# line} -gt $ MAX] ise; sonra MAX = $ {# line}; fi longest < /usr/share/dict/words
.bashrc'nize


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

En uzun satırın uzunluğunu, satır numarasını ve içeriğini yazdırır

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

Satır numaraları ve uzunlukları ile birlikte tüm satırların sıralı bir listesini yazdırır

.Birleştirme operatörü - bu uzunluğu () sonra burada kullanılan
$.mevcut hat numarasıdır
$_akım hattıdır


Bir dosyayı sıralamayı gerektirir .. performans orta boyutlu dosyalar için bile korkunç olurdu ve daha büyük dosyalar için çalışmaz. wc -Lşimdiye kadar gördüğüm en iyi çözüm.
Mart'ta Tagar

Kaynak olarak 550MB 6.000.000 satır metin dosyası kullanan (British National Corpus), perl çözümü 12 saniye wc -Lsürdü, 3 saniye sürdü
Chris Koknat

wc -Lsadece sayı kayıtlarını sayın - bu Q en uzun satırı bulmak üzereydi - tam olarak aynı değil, bu yüzden bu doğru karşılaştırma değil.
Tagar

6

Yukarıdaki örneklerde göz ardı edilen önemli nokta.

Aşağıdaki 2 örnek genişletilmiş sekmeleri sayar

  wc -L  <"${SourceFile}" 
# or
  expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'

Aşağıdaki 2, genişletilmemiş sekmeleri sayar.

  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"

yani

              Expanded    nonexpanded
$'nn\tnn'       10            5

5

Görünüşe göre tüm cevap en uzun satırın satır numarasını vermeyin. Aşağıdaki komut satır numarasını ve kabaca uzunluğunu verebilir:

$ 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

Oraya gidiyoruz. Bu benim iğrenç derecede uzun yorumlarımı bulur. Tesekkurler dostum.
Philip

Bunu bir adım öteye taşıyabilir ve kediyi ortadan kaldırabilirsiniz. awk '{print length}' test.txt | sort -rn | head -1. Gerçek satırın içeriğine de ihtiyacınız varsa awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
kakoma

3

Perl dilinde:

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

bu sadece çizgiyi yazdırır, uzunluğunu da yazdırmaz.



2

Sadece eğlence için, Powershell sürümü:

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

Ve sadece uzunluğu elde etmek için:

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

4
Powershell programcıları bile işe yaramaz kediler mi kullanmalıdır?
Jens

1
@Jens Seni anladığımdan emin değilim, Powershell'deki kedi, davranışı içeriğe ve sağlayıcıya bağlı olan Get-Content için sadece bir takma addır.
eddiegroves

Can sortargüman olarak dosyaadi.txt almak? O zaman kedi işe yaramaz çünkü sort length filename.txt | select -last 1bir borudan ve sadece verileri kopyalayan bir işlemden kaçınır.
Jens

Bir sidenote olarak powershell tam olarak nedir? Powershell yardımcı programının windows makineleri için kullanıldığını düşündüm.
franklin

4
@Jens, veriler genellikle dosya adı yerine bir akıştan geliyor. Bu standart bir unix araçları deyimidir.
Andrew Prock

2

Unix ortamındayım ve boyutu birkaç GB olan gzip dosyaları ile çalışıyorum. 2052 kayıt uzunluğuna sahip 2 GB gzip dosya kullanarak aşağıdaki komutları test ettim.

  1. zcat <gzipped file> | wc -L

ve

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

Zamanlar ortadaydı

  1. 117 saniye

  2. 109 saniye

İşte yaklaşık 10 çalıştırmadan sonra senaryom.

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"

Bunun geçerli bir karşılaştırma olduğundan emin değilim awk, wcsürümün çalışan ilk sürümün (ve disk önbelleğini tohumlar) disk bloğu önbelleğe almasından endişe ediyorum . Bu argümanı sopa yapmak için ilk on koşuda kimin çağrıldığının sırasını rastgele ayarlamanız gerekir.
Kanonik Chris

1

Tema varyasyonu.

Bu , kaynakta göründükleri sırayı koruyarak, dosyada bulunan en uzun satır uzunluğuna sahip tüm satırları gösterecektir .

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

Yani dosyam

x
mn
xyz
123
abc

verecek

xyz
123
abc

0

MacOS kullanıyorsanız ve bu hatayı alıyorsanız: wc: illegal option -- L alıyorsanız: GNU'yu yüklemenize gerek yoktur, bunu yapın.

Yapmak istediğiniz tek şey dosyanın en uzun satırındaki karakter sayısını almak ve OS X run kullanıyorsanız:

awk '{print length}' "$file_name" | sort -rn | head -1

Böyle bir şey;

echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"

Çıktılar:

The longest line in the file my_file has 117 characters

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.