我有几个文件夹,里面包含大量文本文件,从几十到几百个不等。这些文本文件是包含数百万行的简单数据库,每行包含一条记录。但是,其中的记录未排序,并且包含许多重复项。我想对它们进行单独排序和重复数据删除(即彼此独立),但据我了解,sort
只能生成所有输入文件的串联输出 - 也就是说,即使给定多个文件,它也只会生成一个包含所有这些文件组合结果的输出文件。
如何对当前文件夹中的所有文件进行排序,以便为每个文件生成单独排序的输出文件?我还希望将输出文件输出到当前目录中的子文件夹中。循环for
对我来说是显而易见的解决方案,但我在这里问,以防有更简单的方法可以做到这一点,而sort
我还没有遇到或错过。我的bash
知识也很缺乏,所以如果for
循环是最简单的解决方案,我希望有人能提供最好的解决方法,而不是让我花很多天去破解某些东西,但仍然达不到我想要的效果。
答案1
是的,你可以用 来做到这一点for
。即使有“一些更简单的方法可以做到这一点sort
”(但我不这么认为),这也相当简单:
# cd to the directory you want to process
mkdir sorted
for file in *;
do
printf 'Processing %s\n' "$file"
[ -f "$file" ] && sort -u "$file" > "./sorted/$file"
done
笔记:
for file in *
不处理子目录中的文件。printf
仅用于报告进度。实际上它应该放在后面[ ... ]
(见下文),但我不想让代码过于复杂。printf
如果您希望整个过程保持静默,您可以删除该行。[ -f "$file" ]
检查是否$file
是常规文件。对于最通用的模式(即*
),我们至少需要此条件以避免sort
以目录作为参数运行(这会引发错误,无害但不优雅)。如果您使用更具体的 glob(如或而不是sorted
),则很可能不需要此测试(例如跳过不应处理的杂散文件)。在这种情况下,您可以省略并以开始该行(但保留该行不变应该不会有什么坏处)。*.txt
*.db
*
desktop.ini
[ ... ] &&
sort
sort
支持各种选项,您可能需要使用其中一些,具体取决于您需要如何排序。sort -u
在对条目进行排序之后立即对其进行重复数据删除,并且当已经使用sort
该命令时,它是一种冗余度较低的替代方法uniq
。
如果您需要根据比简单的 glob 更复杂的条件来选择文件,find
那么最好从这里开始。对于您当前的任务来说for
应该没问题。