所以自从昨晚以来我一直在玩这个问题,我可以做很多事情,而不是我想要的。
我需要一个代码来查找目录中包含最多行的文件,然后打印文件名和文件所包含的行数。
我可以将整个目录的行打印出来,但似乎无法缩小字段范围。
为傻瓜学习者提供帮助吗?
wc -l $1/* 2>/dev/null
| grep -v ' total$'
| sort -n -k1
| tail -1l
在另一个问题上得到一些亲帮助之后,这就是我所要做的,但它会全部归还,并且不会打印他们的行数。
答案 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