我使用find并将结果保存到file.txt文件中。现在我想检查同名的文件首先排序的最高计数。例如:
/Volumes/1 drive/foo
/Volumes/1 drive/bar
/Volumes/1 drive/foo2
/Volumes/2 drive/foo
/Volumes/2 drive/bar2
/Volumes/3 drive/1/foo
/Volumes/3 drive/2/bar
我正在运行这个命令:
cat file.txt | awk -F '/' '{print $NR}' | uniq -c | sort
但是awk输出不能正常工作,它只打印第一行:
Volumes
1 drive
foo
编辑:输出应该是:
3 foo
2 bar
1 foo2
1 bar2
如果您试图删除路径并仅保留最后一个斜杠之后的部分,您可以使用sed
这样做:sed 's|.*/||'
。
请注意,您需要一个排序的列uniq -c
工作。因此,如果您希望对其输出进行排序,则需要两个sort
调用:
> sed 's|.*/||' file.txt | sort | uniq -c | sort -rn
3 foo
2 bar
1 foo2
1 bar2
如果你想使用awk
,那么你可能需要$NF
而不是$NR
:
awk -F '/' '{print $NF}' file.txt | sort | uniq -c | sort -rn
这个答案显示了awk
的使用。
或者,您可以尝试下面的awk一行代码:
$ awk -F'/' '{a[$NF]++} END{for (x in a)print a[x],x}' file.txt|sort -nr
3 foo
2 bar
1 foo2
1 bar2
{m,n,g}awk '
{ __[$!++NF]++ } END { ___=_+=_=length(FS)
PROCINFO["sorted_in"] = "@val_num_desc"
for (_ in __) {
printf("% 47*.f %sn",___,__[_],_) } }' FS='^.+[/]' OFS=
| gsort -nr # pipe over to sort for any non-gnu awk
3 foo
2 bar
1 foo2
1 bar2
$ xargs -I "{}" basename "{}" <file|sort|uniq -c
2 bar
1 bar2
3 foo
1 foo2
$ xargs -I "{}" basename "{}" <file|sort|uniq -c|sed 's/^ *//'|sort -nr
3 foo
2 bar
1 foo2
1 bar2
使用find作为输入
find /your/path -type f -print0|xargs -0 basename -a|sort|uniq -c|sed 's/^ *//'|sort -nr