9

这是我的尝试

  • 查找所有*.java文件
    find . -name '*.java'
  • 计数线
    wc -l
  • 删除最后一行
    sed '$d'
  • wc使用 AWK 查找输出中的最大行数
    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

4 回答 4

22
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)
于 2011-12-13T12:28:02.333 回答
14
find . -name "*.java" -type f | xargs wc -l | sort -rn | grep -v ' total$' | head -1
于 2011-12-13T12:21:39.093 回答
0

像这样的东西可能会起作用:

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

(根据 Ed Morton 的评论编辑。我一定喝了太多咖啡 :-))

于 2011-12-13T11:30:00.720 回答
0

要使用 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 }
'

要获取非空行的计数,只需将增加 size[] 的行设为有条件的:

$ 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
}
'
于 2012-11-26T22:20:21.243 回答