Saya mencari cara sederhana untuk menemukan panjang baris terpanjang dalam sebuah file. Idealnya, ini akan menjadi perintah bash shell sederhana, bukan skrip.
Saya mencari cara sederhana untuk menemukan panjang baris terpanjang dalam sebuah file. Idealnya, ini akan menjadi perintah bash shell sederhana, bukan skrip.
Jawaban:
Menggunakan wc (GNU coreutils) 7.4:
wc -L filename
memberi:
101 filename
-L
tergantung pada lokal. Beberapa karakter (baik dalam byte dan dalam arti multibyte) bahkan mungkin tidak dihitung sama sekali!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
ada dalam coreutils
rumus, yang menginstal semua coreutils GNU dengan g
awalan.
awk '{print length, $0}' Input_file |sort -nr|head -1
Untuk referensi: Menemukan baris terpanjang dalam file
END{}
blok.
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
Hanya untuk bersenang-senang dan tujuan pendidikan, solusi shell POSIX murni , tanpa penggunaan kucing yang tidak berguna dan tidak ada forking untuk perintah eksternal. Mengambil nama file sebagai argumen pertama:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
itu dapat dengan mudah membaca dari stdin. Dengan tes untuk $#
itu bahkan bisa melakukan keduanya, tergantung pada jumlah args. Tidak perlu bagi kucing yang tidak berguna di dunia ini. Pemula harus diajari sesuai sejak awal.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
Mencetak panjang, nomor baris, dan isi dari garis terpanjang
perl -ne 'print length()." line $. $_"' myfile | sort -n
Mencetak daftar semua garis yang diurutkan, dengan nomor dan panjang garis
.
adalah operator gabungan - digunakan di sini setelah panjang ()
$.
adalah nomor baris saat ini
$_
adalah baris saat ini
wc -L
adalah solusi terbaik yang saya lihat sejauh ini.
wc -L
mengambil 3 detik
wc -L
hitung saja catatan jumlah - Q ini akan menemukan garis terpanjang - tidak persis sama, jadi ini bukan perbandingan yang akurat.
Poin penting yang diabaikan dalam contoh di atas.
2 contoh berikut menghitung tab yang diperluas
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
Berikut adalah 2 tab yang tidak diperluas.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
begitu
Expanded nonexpanded
$'nn\tnn' 10 5
Terlihat semua jawabannya jangan berikan nomor baris dari baris terpanjang. Perintah berikut dapat memberikan nomor baris dan panjang kira-kira:
$ 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
. Jika Anda memerlukan konten baris yang sebenarnya juga, maka awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Berikut adalah referensi dari anwser
cat filename | awk '{print length, $0}'|sort -nr|head -1
Hanya untuk bersenang-senang, inilah versi Powershell:
cat filename.txt | sort length | select -last 1
Dan untuk mendapatkan panjangnya:
(cat filename.txt | sort length | select -last 1).Length
sort
mengambil filename.txt sebagai argumen? Maka kucing tidak berguna karena sort length filename.txt | select -last 1
menghindari pipa dan proses yang hanya menyalin data sekitar.
Saya berada di lingkungan Unix, dan bekerja dengan file yang di-gzip dengan ukuran beberapa GB. Saya menguji perintah berikut menggunakan file gzip 2 GB dengan panjang catatan 2052.
zcat <gzipped file> | wc -L
dan
zcat <gzipped file> | awk '{print length}' | sort -u
Waktu berada di rata
117 detik
109 detik
Ini skrip saya setelah sekitar 10 kali.
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
manfaat versi dari caching blok disk dari wc
versi yang berjalan pertama (dan biji cache disk). Anda harus mengacak urutan siapa yang dipanggil pertama kali dari sepuluh kali agar argumen ini tetap berlaku.
Variasi pada tema.
Yang ini akan menampilkan semua baris yang memiliki panjang garis terpanjang yang ditemukan dalam file, mempertahankan urutan mereka muncul di sumber.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Jadi file saya
x
mn
xyz
123
abc
akan memberi
xyz
123
abc
Jika Anda menggunakan MacOS dan mendapatkan kesalahan ini:
wc: illegal option -- L
Anda tidak perlu menginstal GNU, lakukan ini.
Jika yang Anda ingin lakukan hanyalah mendapatkan jumlah karakter di baris terpanjang file dan Anda menggunakan OS X run:
awk '{print length}' "$file_name" | sort -rn | head -1
Sesuatu seperti ini;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Output:
The longest line in the file my_file has 117 characters
-c -l -m -w
opsi yang POSIX.-L
adalah GNUism.