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.
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:
Wc (GNU coreutils) kullanarak 7.4:
wc -L filename
verir:
101 filename
-L
yerel ayara bağlı olduğuna dikkat edin. Bazı karakterler (hem bayt hem de çok baytlı anlamda) hiç sayılmayabilir!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
, coreutils
tüm GNU coreutils'lerini bir g
önekle yükleyen formüldedir .
awk '{print length, $0}' Input_file |sort -nr|head -1
Başvuru için: Bir dosyadaki en uzun satırı bulma
END{}
bloktan yazdırın .
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
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"
< "$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.
longest < /usr/share/dict/words
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
wc -L
şimdiye kadar gördüğüm en iyi çözüm.
wc -L
sürdü, 3 saniye sürdü
wc -L
sadece 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.
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
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
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
İşte anwser referansları
cat filename | awk '{print length, $0}'|sort -nr|head -1
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
sort
argüman olarak dosyaadi.txt almak? O zaman kedi işe yaramaz çünkü sort length filename.txt | select -last 1
bir borudan ve sadece verileri kopyalayan bir işlemden kaçınır.
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.
zcat <gzipped file> | wc -L
ve
zcat <gzipped file> | awk '{print length}' | sort -u
Zamanlar ortadaydı
117 saniye
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"
awk
, wc
sü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.
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
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
-c -l -m -w
seçeneklerin POSIX olduğunu unutmayın .-L
bir GNUizmdir.