1

所以从昨晚开始我就一直在玩这个,我可以让很多事情发生,只是不是我想要的。

我需要一个代码来查找目录中行数最多的文件,然后打印文件名和该文件的行数。

我可以打印整个目录的行,但可以这么说似乎无法缩小范围。

对傻瓜学习者有什么帮助吗?

wc -l $1/* 2>/dev/null
   | grep -v ' total$'
   | sort -n -k1
   | tail -1l

在另一个问题的一些专业帮助之后,这就是我要去的地方,但它会将它们全部返回,并且不会打印它们的行数。

4

2 回答 2

1

以下 awk 命令应该为您完成这项工作,您可以避免所有多余的管道命令:

wc -l $1/* | awk '$2 != "total"{if($1>max){max=$1;fn=$2}} END{print max, fn}'

更新:为了避免 wc 输出的最后一行,这可能是更好的 awk 命令:

wc -l $1/* | awk '{arr[cnt++]=$0} END {for (i=0; i<length(arr)-1; i++) 
                  {split(arr[i], a, " "); if(a[1]>max) {max=a[1]; fn=a[2]}} print max, fn}'
于 2013-06-12T15:31:13.087 回答
0

你可以试试:

wc -l $1/* | grep -v total | sort -g | tail -1

实际上是为了避免 grep 也会删除包含“total”的文件:

for f in $1/*; do wc -l $f; done | sort -g | tail -1

甚至更好,正如评论中所建议的:

wc -l $1/* | sort -rg | sed -n '2p'

你甚至可以使它成为一个函数:

function get_biggest_file() {
    wc -l $* | sort -rg | sed -n '2p'
}

% ls -l
...  0 Jun 12 17:33 a
...  0 Jun 12 17:33 b
...  0 Jun 12 17:33 c
...  0 Jun 12 17:33 d
... 25 Jun 12 17:33 total
% get_biggest_file ./*
5 total

EDIT2:使用我提供的功能,您可以简单地输出您需要的内容,如下所示:

get_biggest $1/* | awk '{print "The file \"" $2 "\" has the maximum number of lines: " $1}'

编辑:如果您尝试按照问题中的方式编写函数,则应在末尾添加行继续符,如下所示,否则您的 shell 会认为您正在尝试发出 4 个命令:

wc -l $1/* 2>/dev/null \
   | grep -v ' total$' \
   | sort -n -k1 \
   | tail -1l
于 2013-06-12T15:19:36.330 回答