对现有代码有许多改进,即:
#!/bin/bash
file=./data/*.txt
name= ls ./data > output.csv
unique= sort $file | uniq | wc -l >> output.csv
total= cat $file | wc -l >> output.csv
nano output.csv
这三行代码用于output.csv
仔细设置环境变量name
、清空字符串unique
然后total
运行命令——这并不完全是错误的,但也不是你想的那样。sort | uniq
可以简化sort -u
为。不需要cat $file | wc -l
whenwc -l < $file
用更少的流程来完成同样的工作。该ls
行正在生成与通配符扩展相同的名称。一次一个文件与所有文件一起存在一些问题。
如果您想要一个 CSV 文件,其中包含每个文件的名称、唯一行和总行数,那么我们希望在代码中看到一个循环。
for file in ./data/*.txt
do
unique=$(sort -u $file | wc -l)
total=$(wc -l < $file)
echo "$file,$unique,$total"
done
这运行sort -u
以唯一排序(不需要显式uniq
),并从wc -l
. 它wc -l
使用来自文件的标准输入运行总行数;使用 I/O 重定向停止wc
打印文件名。然后回显打印数据。如果您只想要文件的基本名称(只是xyz.txt
而不是./data/xyz.txt
),那么您可以在以下位置修复它echo
:
echo "$(basename $file),$unique,$total"
或者:
echo "${file##*/},$unique,$total"
唯一可能的缺点是它对每个文件运行一次命令,如果有很多文件,这可能会有点问题。然而,这会奏效——先把它做好,然后,如果有速度问题,花时间优化它。