获取行数最高的 n 个文件的文件名

获取行数最高的 n 个文件的文件名

我正在尝试从最高行数到最低行数打印 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 脚本来为您完成这项工作:

  1. 您传入所需的文件数量和要处理的文件列表
  2. 它计算行数并将结果存储在关联数组中
  3. 它按值对数组进行排序并打印文件数

脚本中没有错误检查(例如“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 脚本中完成该工作。

相关内容