2011-12-13 33 views
6

Đây là cố gắng của tôi để làm điều đóBash: Tìm tập tin với dòng max đếm

  • Tìm tất cả *.java file
    find . -name '*.java'
  • dòng Đếm
    wc -l
  • Xóa dòng cuối cùng
    sed '$d'
  • Sử dụng AWK để tìm số dòng tối đa trong số wc đầu ra
    awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}'

sau đó hợp nhất nó vào dòng

find . -name '*.java' | xargs wc -l | sed '$d' | awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}' 

Tôi có thể bằng cách nào đó thực hiện đếm dòng chỉ không trống?

+0

Giải pháp của bạn có thể sẽ bị đổ vỡ khi gặp phải tên tệp bất thường. Sử dụng '-print0' trong' find' cùng với tùy chọn '-0' trong' xargs', giống như thế này - 'tìm. -name '* .java' -print0 | xargs -0 wc -l | sắp xếp -n | đuôi -2 | head -1' – potong

Trả lời

14
find . -type f -name "*.java" -exec grep -H -c '[^[:space:]]' {} \; | \ 
    sort -nr -t":" -k2 | awk -F: '{print $1; exit;}' 

Thay awk lệnh với head -n1 nếu bạn cũng muốn xem số dòng không trống.


Breakdown của lệnh:

find . -type f -name "*.java" -exec grep -H -c '[^[:space:]]' {} \; 
'---------------------------'  '-----------------------' 
      |         | 
    for each *.java file    Use grep to count non-empty lines 
            -H includes filenames in the output 
           (output = ./full/path/to/file.java:count) 

| sort -nr -t":" -k2 | awk -F: '{print $1; exit;}' 
    '----------------' '-------------------------' 
      |       | 
    Sort the output in   Print filename of the first entry (largest count) 
reverse order using the   then exit immediately 
    second column (count) 
+0

Tuyệt vời, tôi thích điều này hơn, vì nó tiết lộ tùy chọn 'find -exec', hữu ích hơn so với vòng lặp –

+0

Nó sẽ không thành công cho tên tệp có chứa dấu hai chấm hoặc dòng mới. –

0

Something như thế này có thể làm việc:

find . -name '*.java'|while read filename; do 
    nlines=`grep -v -E '^[[:space:]]*$' "$filename"|wc -l` 
    echo $nlines $filename 
done|sort -nr|head -1 

(sửa theo ý kiến ​​Ed Morton của tôi phải có quá nhiều cà phê :-).)

+1

Điều này sẽ thất bại trên tên tập tin với không gian, trong số những thứ khác, và bằng cách sử dụng 'eval' theo cách này là hầu như không cần thiết. – Sorpigal

+0

@holygeek - tại sao bạn nghĩ rằng eval là cần thiết? Loại bỏ các eval và tất cả các thoát và báo giá $ filename và rằng một dòng ít nhất sẽ "làm việc". –

5
find . -name "*.java" -type f | xargs wc -l|sort -rn|grep -v ' total$'|head -1 
+0

Không tệ, nhưng cần chỉnh sửa để chỉ hiển thị tệp với hầu hết các dòng mã, giờ đây nó hiển thị tất cả các tệp có số lượng của chúng –

+0

yeah ..bạn đang đúng.just quên thêm một đường ống nữa.được thêm vào bây giờ – Vijay

0

Để có được kích thước của tất cả các tập tin của bạn sử dụng awk chỉ là:

$ find . -name '*.java' -print0 | xargs -0 awk ' 
BEGIN { for (i=1;i<ARGC;i++) size[ARGV[i]]=0 } 
{ size[FILENAME]++ } 
END { for (file in size) print size[file], file } 
' 

Để lấy số liệu của các dòng không trống , chỉ cần tạo dòng mà bạn tăng kích thước [] có điều kiện:

$ find . -name '*.java' -print0 | xargs -0 awk ' 
BEGIN { for (i=1;i<ARGC;i++) size[ARGV[i]]=0 } 
NF { size[FILENAME]++ } 
END { for (file in size) print size[file], file } 
' 

(. Nếu bạn muốn xem xét dòng có chứa chỉ khoảng trống như "trống rỗng", sau đó thay thế NF với /^./)

Để có được chỉ các tập tin với các dòng nhất không trống chỉ tinh chỉnh một lần nữa:

$ find . -name '*.java' -print0 | xargs -0 awk ' 
BEGIN { for (i=1;i<ARGC;i++) size[ARGV[i]]=0 } 
NF { size[FILENAME]++ } 
END { 
    for (file in size) { 
     if (size[file] >= maxSize) { 
     maxSize = size[file] 
     maxFile = file 
     } 
    } 
    print maxSize, maxFile 
} 
' 
Các vấn đề liên quan