我正在尝试从最高行数到最低行数打印 x 个文件名。自动取款机我有这个
wc -l /etc/*.conf |sort -rn | head -6 | tail -5 |
我明白了
543 /etc/ltrace.conf
523 /etc/sensors3.conf
187 /etc/pnm2ppa.conf
144 /etc/ca-certificates.conf
现在这样就可以了,但是我只需要名字,有什么办法可以删除行数吗?
答案1
替代:
wc -l /etc/*.conf |sort -rn | head -6 | tail -5 | tr -s ' ' | cut -d' ' -f3
答案2
另一种高尔夫变体。
wc -l /etc/*.conf | sort -rn | sed -n '2,5s/^ *[1-9][0-9]* //p'
该命令sed
采用第 2-5 行(第 1 行是总计,因为我们颠倒了输出行顺序)并删除了前导的“{space} {number} {space}”模式。
(与所有其他解决方案相同迄今为止,当给定包含换行符的文件名时,此管道并不健壮。)
答案3
最后一个head
+tail
可以替换为单个awk
仅打印顶部的单个表达式5 文件名:
wc -l /etc/*.conf | sort -rn | awk 'NR>1{ $1=""; print $0 }NR==6{ exit }'
答案4
我将使用一个简单的 perl 脚本来为您完成这项工作:
- 您传入所需的文件数量和要处理的文件列表
- 它计算行数并将结果存储在关联数组中
- 它按值对数组进行排序并打印文件数
脚本中没有错误检查(例如“N”是正常的;有一个非空文件列表;“N”不大于文件数;文件是常规文件而不是目录、套接字、 ETC)。
#!/usr/bin/perl
# prints the top N given files by line count
my $n = shift;
my %counts = ();
foreach my $file (@ARGV) {
chomp($counts{$file} = `wc -l < "$file"`);
}
foreach my $file (sort { $counts{$b} <=> $counts{$a} } keys %counts) {
print "$file\n";
last unless --$n;
}
这个方向比尝试对 shell 数组中的值进行排序或依赖文件名省略某些字符更容易。如果您的文件名包含换行符,perl 脚本的输出可能会不明确;如果您要对这些文件进行进一步的处理,我会在 perl 脚本中完成该工作。