Bash: найти файл с максимальным количеством строк - PullRequest
6 голосов
/ 13 декабря 2011

Это моя попытка сделать это

  • Найти все *.java файлы
    find . -name '*.java'
  • Количество строк
    wc -l
  • Удалить последнюю строку
    sed '$d'
  • Используйте AWK, чтобы найти максимальное число строк в wc выводе
    awk 'max=="" || data=="" || $1 > max {max=$1 ; data=$2} END{ print max " " data}'

, затем объедините его в одну строку

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

Можно ли как-то реализовать подсчет только непустых строк?

Ответы [ 4 ]

16 голосов
/ 13 декабря 2011
find . -type f -name "*.java" -exec grep -H -c '[^[:space:]]' {} \; | \
    sort -nr -t":" -k2 | awk -F: '{print $1; exit;}'

Замените команду awk на head -n1, если вы также хотите увидеть количество непустых строк.


Разбивка команды:

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)
7 голосов
/ 13 декабря 2011
find . -name "*.java" -type f | xargs wc -l | sort -rn | grep -v ' total$' | head -1
0 голосов
/ 27 ноября 2012

Чтобы получить размер всех ваших файлов с помощью awk, просто:

$ 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 }
'

Чтобы получить количество непустых строк, просто сделайте строку, в которой вы увеличиваете размер [], условной:

$ 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 }
'

(Если вы хотите считать строки, содержащие только пробелы, «пустыми», замените NF на /^./.)

Чтобы получить только файл с наибольшим количествомпустые строки просто настраиваются снова:

$ 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
}
'
0 голосов
/ 13 декабря 2011

Примерно так может работать:

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

(отредактировано в соответствии с комментарием Эда Мортона. Должно быть, я выпил слишком много кофе :-))

...