尝试使用行号来获取最大行的文件

时间:2013-06-12 15:15:56

标签: linux bash shell

所以自从昨晚以来我一直在玩这个问题,我可以做很多事情,而不是我想要的。

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

我可以将整个目录的行打印出来,但似乎无法缩小字段范围。

为傻瓜学习者提供帮助吗?

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

在另一个问题上得到一些亲帮助之后,这就是我所要做的,但它会全部归还,并且不会打印他们的行数。

2 个答案:

答案 0 :(得分:1)

遵循awk命令应该为您完成工作,您可以避免所有冗余的管道命令:

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

UPDATE:为了避免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}'

答案 1 :(得分: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个命令:< / p>

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