我有一个包含大型 csv 文件的目录和子目录列表。这些文件大约有5亿行,每行都是一条记录。我想知道
- 每个文件中有多少行。
- 目录中有多少行。
- 总共有多少行
最重要的是,我需要“人类可读格式”,例如。 12,345,678 而不是 12345678
如果能够学习如何通过 3 种方式做到这一点,那就太好了。普通的 bash 工具、awk 等,以及 perl(或 python)。
答案1
每个文件中有多少行。
我相信,最初使用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
巴什有一个打印函数内置函数:
printf "%0.2f\n" $T
与往常一样,有许多不同的方法可用于实现此处提到的相同结果。
答案2
在许多情况下,组合wc
命令和通配符*
可能就足够了。
如果您的所有文件都在一个目录中,您可以调用:
wc -l src/*
您还可以列出多个文件和目录:
wc -l file.txt readme src/* include/*
此命令将显示文件列表及其行数。
最后一行将是所有文件中行的总和。
要递归计算目录中的所有文件:
首先,通过添加到您的 .bash_profile 来启用 globstar shopt -s globstar
。支持 globstar 需要 Bash ≥ 4.x,brew install bash
如果需要可以安装。您可以使用 检查您的版本bash --version
。
然后运行:
wc -l **/*
请注意,如果未启用 globstar,此输出将不正确。
答案3
此命令将给出每个目录中的行代码列表:
find . -name '*.*' -type f | xargs wc -l
答案4
游戏有点晚了,但由于目录的大小,我在上面遇到了一堆参数错误。这对我有用:
for i in $(find . -type f); do wc -l $i; done >> /home/counts.txt