Tôi đang tìm kiếm một cách đơn giản để tìm độ dài của dòng dài nhất trong một tệp. Lý tưởng nhất, nó sẽ là một lệnh bash shell đơn giản thay vì một tập lệnh.
Tôi đang tìm kiếm một cách đơn giản để tìm độ dài của dòng dài nhất trong một tệp. Lý tưởng nhất, nó sẽ là một lệnh bash shell đơn giản thay vì một tập lệnh.
Câu trả lời:
Sử dụng wc (GNU coreutils) 7.4:
wc -L filename
cho:
101 filename
-L
phụ thuộc vào miền địa phương. Một số ký tự (cả theo byte và theo nghĩa đa nhân) thậm chí có thể không được tính!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
có trong coreutils
công thức, cài đặt tất cả các lõi GNU với g
tiền tố.
awk '{print length, $0}' Input_file |sort -nr|head -1
Để tham khảo: Tìm dòng dài nhất trong một tệp
END{}
khối.
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
Chỉ nhằm mục đích vui chơi và giáo dục, giải pháp vỏ POSIX thuần túy , không sử dụng con mèo vô dụng và không từ bỏ các lệnh bên ngoài. Lấy tên tệp làm đối số đầu tiên:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
nó có thể dễ dàng đọc từ stdin. Với một bài kiểm tra cho $#
nó thậm chí có thể làm cả hai, tùy thuộc vào số lượng đối số. Không cần cho những con mèo vô dụng trong thế giới này. Người mới nên được dạy cho phù hợp ngay từ đầu.
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
In độ dài, số dòng và nội dung của dòng dài nhất
perl -ne 'print length()." line $. $_"' myfile | sort -n
In một danh sách được sắp xếp của tất cả các dòng, với số dòng và độ dài
.
là toán tử ghép - nó được sử dụng ở đây sau length ()
$.
là số dòng hiện tại
$_
là dòng hiện tại
wc -L
là giải pháp tốt nhất tôi thấy cho đến nay.
wc -L
mất 3 giây
wc -L
chỉ cần đếm các bản ghi số - Q này sắp tìm dòng dài nhất - không hoàn toàn giống nhau, vì vậy đây không phải là so sánh chính xác.
Điểm bỏ qua quan trọng trong các ví dụ trên.
2 ví dụ sau đây đếm các tab mở rộng
wc -L <"${SourceFile}"
# or
expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'
2 tab sau đây không đếm được.
expand --tabs=1 "${SourceFile}" | wc -L
# or
awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"
vì thế
Expanded nonexpanded
$'nn\tnn' 10 5
Có vẻ như tất cả các câu trả lời không đưa ra số dòng của dòng dài nhất. Lệnh sau có thể cho số dòng và độ dài khoảng:
$ 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
. Nếu bạn cũng cần nội dung của dòng thực tế, thì awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
Dưới đây là tài liệu tham khảo của anwser
cat filename | awk '{print length, $0}'|sort -nr|head -1
Để giải trí, đây là phiên bản Powershell:
cat filename.txt | sort length | select -last 1
Và để có được chiều dài:
(cat filename.txt | sort length | select -last 1).Length
sort
lấy filename.txt làm đối số? Sau đó, con mèo là vô dụng vì sort length filename.txt | select -last 1
tránh một đường ống và một quá trình chỉ sao chép dữ liệu xung quanh.
Tôi đang ở trong môi trường Unix và làm việc với các tệp được nén với kích thước vài GB. Tôi đã kiểm tra các lệnh sau bằng cách sử dụng tệp được nén 2 GB với độ dài bản ghi là 2052.
zcat <gzipped file> | wc -L
và
zcat <gzipped file> | awk '{print length}' | sort -u
Thời gian đã ở trên tuyết
117 giây
109 giây
Đây là kịch bản của tôi sau khoảng 10 lần chạy.
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
phiên bản được hưởng lợi từ bộ nhớ đệm khối đĩa của wc
phiên bản đang chạy đầu tiên (và gieo hạt vào bộ đệm đĩa). Bạn sẽ phải chọn ngẫu nhiên thứ tự của người được gọi đầu tiên trong mười lần chạy để làm cho đối số này được duy trì.
Biến thể về chủ đề.
Cái này sẽ hiển thị tất cả các dòng có độ dài của dòng dài nhất được tìm thấy trong tệp, giữ nguyên thứ tự chúng xuất hiện trong nguồn.
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
Vì vậy, tôi
x
mn
xyz
123
abc
sẽ cho
xyz
123
abc
Nếu bạn đang sử dụng MacOS và đang gặp lỗi này:
wc: illegal option -- L
bạn không cần phải cài đặt GNU sipmly làm điều này.
Nếu tất cả những gì bạn muốn làm chỉ là lấy số lượng ký tự trong dòng dài nhất của tệp và bạn đang sử dụng OS X chạy:
awk '{print length}' "$file_name" | sort -rn | head -1
Một cái gì đó như thế này;
echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"
Đầu ra:
The longest line in the file my_file has 117 characters
-c -l -m -w
tùy chọn là POSIX.-L
là một chủ nghĩa GNU.