您如何以人类可读的格式列出目录中每个文件的行数。

Hex*_*nic 67 bash awk python perl

我有一个包含大型 csv 文件的目录和子目录列表。这些文件大约有 5 亿行,每一行都是一条记录。我想知道

  1. 每个文件有多少行。
  2. 目录中有多少行。
  3. 总共多少行

最重要的是,我需要“人类可读的格式”,例如。12,345,678 而不是 12345678

学习如何以 3 种方式做到这一点会很好。普通的 bash 工具、awk 等,以及 perl(或 python)。

mal*_*lyy 95

每个文件有多少行。

使用wc, 最初用于字数统计,我相信,但它可以做行、字、字符、字节和最长的行长度。该-l选项告诉它计算行数。

wc -l <filename>
Run Code Online (Sandbox Code Playgroud)

这将输出中的行数:

$ wc -l /dir/file.txt
32724 /dir/file.txt
Run Code Online (Sandbox Code Playgroud)

您还可以将数据通过管道传输到wc

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63
Run Code Online (Sandbox Code Playgroud)

目录中有多少行。

尝试:

find . -name '*.pl' | xargs wc -l
Run Code Online (Sandbox Code Playgroud)

另一个单线:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l
Run Code Online (Sandbox Code Playgroud)

顺便说一句,wc命令计算新行代码,而不是行数。当文件中的最后一行不以换行代码结束时,这将不计算在内。

您可以使用 grep -c ^ ,完整示例:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total
Run Code Online (Sandbox Code Playgroud)

总共多少行

不确定我是否正确理解您的请求。例如,这将以以下格式输出结果,显示每个文件的行数:

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total
Run Code Online (Sandbox Code Playgroud)

或者,仅按文件计数输出没有文件的新行字符总数到以下命令可以证明是有用的:

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613
Run Code Online (Sandbox Code Playgroud)

最重要的是,我需要“人类可读的格式”,例如。12,345,678 而不是 12345678

Bash 有一个内置的printf函数:

printf "%0.2f\n" $T
Run Code Online (Sandbox Code Playgroud)

与往常一样,有许多不同的方法可用于实现此处提到的相同结果。


小智 20

在许多情况下,将wc命令和通配符组合起来*可能就足够了。
如果您的所有文件都在一个目录中,您可以调用:

wc -l src/*
Run Code Online (Sandbox Code Playgroud)

您还可以列出多个文件和目录:

wc -l file.txt readme src/* include/*
Run Code Online (Sandbox Code Playgroud)

此命令将显示文件列表及其行数。
最后一行将是所有文件行的总和。


递归计算目录中的所有文件:

首先,通过添加shopt -s globstar到您的 .bash_profile 来启用 globstar 。支持 globstar 需要 Bash 吗?brew install bash如果需要,可以安装 4.x。您可以使用bash --version.

然后运行:

wc -l **/*
Run Code Online (Sandbox Code Playgroud)

请注意,如果未启用 globstar,此输出将不正确。


小智 6

此命令将给出每个目录中的行代码列表:

find . -name '*.*' -type f | xargs wc -l
Run Code Online (Sandbox Code Playgroud)

  • 在 *nix 系统上,文件名中不一定包含点“.”。此命令将查找“output.txt”和“output.thu.txt”等文件,但不会包含“output”等名称的文件。使用 `-name *` 可以,但是使用 `-name` 就没有任何意义了。该命令将是“find”。-类型 f | xargs wc -l` (2认同)

Ada*_*ent 6

我将补充@malyy 对以下内容的回答(对于评论来说太重要了):

总共有多少行

许多答案都使用wc命令行文件选项xargs。问题是 xargs 仅限于相当小的平台相关大小。

此外,BSD (macOS) 和 GNU (linux/homebrew) 之间也存在差异wc

GNU 是理想的,因为它可以从文件而不是参数 ( --files0) 中读取文件列表。

如果您使用的是 Mac 且有自制软件,您应该执行以下操作:

find . -name "*.pl" -print0 | gwc -l --files0=-
Run Code Online (Sandbox Code Playgroud)

请注意 gwc 而不是 wc