对现有代码有许多改进,即:
#!/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 -lwhenwc -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"
唯一可能的缺点是它对每个文件运行一次命令,如果有很多文件,这可能会有点问题。然而,这会奏效——先把它做好,然后,如果有速度问题,花时间优化它。