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


40

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

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

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

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

Answers:


56

每个文件中有几行。

使用wc,最初是为字数,我相信,但它可以做的线条,字,字符,字节,最长的线路长度。该-l选项告诉它计数行。

wc -l <filename>

这将输出行数:

$ wc -l /dir/file.txt
32724 /dir/file.txt

您还可以通过管道将数据发送到wc

$ cat /dir/file.txt | wc -l
32724
$ curl google.com --silent | wc -l
63

目录中有几行。

尝试:

find . -name '*.pl' | xargs wc -l

另一个单线:

( find ./ -name '*.pl' -print0 | xargs -0 cat ) | wc -l

顺便说一句,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

总共多少行

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

# wc -l `find /path/to/directory/ -type f`
 103 /dir/a.php
 378 /dir/b/c.xml
 132 /dir/d/e.xml
 613 total

或者,仅将换行符的总数而不按文件计数输出到以下命令可能会很有用:

# find /path/to/directory/ -type f -exec wc -l {} \; | awk '{total += $1} END{print total}'
 613

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

Bash具有内置的printf函数:

printf "%0.2f\n" $T

与往常一样,可以使用许多不同的方法来获得此处提到的相同结果。


顺便说一句,我如何在示例中使用printf?我试图从wc -l传递到它,但是没有用。
Hexatonic

尝试>查找。名称'* .pl'| xargs wc -l | awk'{printf(“%0.2f”,$ 1)} {print $ 2}'更改'printf'的输出以满足您的需要
2016年

但是,这不会在数字上添加逗号,以使其更易于阅读。它只是在末尾添加零。
Hexatonic

回声1000000000000 | xargs printf“%'d \ n” 1,000,000,000,000
Hexatonic

1
@Hexatonic printf不读取从它的参数stdin,而是通过命令行(比较管道到echoVS管道到cat; cat从读取stdinecho没有)。而是使用printf "$(find ... | xargs ...)"将输出作为参数提供给printf
BallpointBen

13

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

wc -l src/*

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

wc -l file.txt readme src/* include/*

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


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

首先,通过添加shopt -s globstar到.bash_profile来启用globstar 。对globstar的支持要求Bash≥4.x,可以在需要时安装brew install bash。您可以使用检查版本bash --version

然后运行:

wc -l **/*

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


并递归计数当前目录中的文件:wc -l **/*
Taylor Edmiston

@TaylorEdmiston对我(在Mac上)仅将文件精确地向下计数一个目录。它会跳过当前目录中的文件,对于任何超过一个目录深的实例,它都会警告它是一个目录:“ wc: parent_dir/child_dir: read: Is a directory
M. Justin

@Thomio它要求启用globstar。在macOS上,我认为它是开箱即用的。我刚刚对您的答案进行了修改,添加了命令以及如何启用globstar。
泰勒·埃德米斯顿

2

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

find . -name '*.*' -type f | xargs wc -l

2

游戏有点晚了,但是由于目录的大小,我在上面遇到了很多参数错误。这对我有用:

for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt


0

cat将文件合并为一个文件,并将所有内容输出到stdout,您可以wc -l对目录中的文件行总数执行此操作:

cat /path/to/directory/* | wc -l

0

我将在以下内容中增加@malyy的答案(以发表评论):

总共多少行

许多答案都使用wc带有的命令行文件选项xargs。问题是xargs被限制在一个很小的平台相关大小上。

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

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

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

find . -name "*.pl" -print0 | gwc -l --files0=-

注意gwc而不是wc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.