Bash:查找最大行数的文件

时间:2011-12-13 11:21:34

标签: bash unix sed awk wc

这是我的尝试

  • 查找所有*.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 个答案:

答案 0 :(得分:16)

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)

答案 1 :(得分:7)

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

答案 2 :(得分: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的评论编辑。我一定有太多咖啡:-))

答案 3 :(得分: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 }
'

要获得非空行的计数,只需将增加大小[]条件的行设为:

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