tìm độ dài của dòng dài nhất trong tất cả các tệp văn bản trong một thư mục


16

Tôi biết cách lấy độ dài của dòng dài nhất trong tệp văn bản với awk

awk ' { if ( length > L ) { L=length} }END{ print L}' file.txt

nhưng làm thế nào tôi có thể có được độ dài của dòng dài nhất trong tất cả các tệp trong một thư mục?

Câu trả lời:


11

Giải pháp đơn giản nhất là nối tất cả các tệp và đưa kết quả vào tập lệnh của bạn:

cat ./* | awk '{ if ( length > L ) { L=length} }END{ print L}'

Bạn cũng có thể chuyển trực tiếp một số tệp vào awk:

awk '{ if ( length > L ) { L=length} }END{ print L}' ./*

Tất nhiên, có thể có một số cảnh báo nếu các tệp trong thư mục thực tế nhưng nó sẽ vô hại. Bạn có thể gặp vấn đề lớn hơn với các tệp nhị phân vì chúng không có khái niệm về dòng . Vì vậy, để cụ thể hơn, bạn có thể làm một cái gì đó như

 awk '{ if ( length > L ) { L=length} }END{ print L}' ./*.txt

để chỉ khớp với các .txttập tin trong thư mục hiện tại.

Và, như @ G-Man đã nêu trong nhận xét của mình, *sẽ không khớp các tệp ẩn (bắt đầu bằng dấu chấm). Nếu bạn muốn những cái đó, sử dụng * .*.


Hoặc, được cho là , cat * .* | .... Hoặc loại bỏ việc sử dụng mèo vô dụng và nói awk '...' * .*.
G-Man nói 'Phục hồi Monica'

@ G-Man Thật vậy. Tôi đã chỉnh sửa câu trả lời của tôi về điều đó khi bạn bình luận. :-) Tôi nói đơn giản nhất vì việc ghép các tệp với con mèo lúc đầu có vẻ đơn giản hơn.
lgeorget

4

Với GNU wc:

cat *.txt|wc -L

-L in chiều dài của dòng dài nhất.


4

Nếu bạn muốn độ dài tối đa cho mỗi tệp, với GNU awk:

find . -type f -exec awk -v l=0 '
   length>l {l=length} ENDFILE{print FILENAME ":", l; l=0}' {} +

Hoặc độ dài tối đa trong tất cả các tệp:

find . -type f -size +1c -exec cat {} + |
  awk -v l=0 'length>l {l=length}; END{print l}'

Giả sử các tập tin kết thúc bằng ký tự dòng mới. Nếu một tệp không kết thúc bằng một ký tự dòng mới, thì dòng không phân tách cuối cùng của nó sẽ được hợp nhất với dòng đầu tiên của tệp tiếp theo và có thể làm mất kết quả của bạn.

-size +1c là một tối ưu hóa vì các tệp văn bản trống hoặc chỉ chứa một ký tự có 0 dòng tương ứng và 1 dòng trống, vì vậy sẽ không có dòng dài nhất.


Chúng là các tệp văn bản, vì vậy chúng kết thúc bằng các ký tự dòng mới (trừ khi trống).
Gilles 'SO- ngừng trở nên xấu xa'

0

Ngoài ra với GNU wc (coreutils 8.4), nó có thể xử lý nhiều tệp

wc -L *.txt
  • liệt kê độ dài của từng tệp riêng lẻ
  • cũng như cung cấp độ dài dài nhất của tất cả các tệp

Đây thực chất là những gì câu trả lời khác này đề cập wc -L, nhưng giải pháp của bạn có nhược điểm là bạn phải lội qua độ dài tối đa của tất cả các tệp khác trước. Có bất kỳ lợi thế trong đó?
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.