我有几个文件夹,其中包含许多文本文件,范围从数十到100s。这些文本文件是包含数百万行的简单数据库,每行包含一个记录。但是,它们中的记录是未排序的,并且包含许多重复项。我想分别对它们进行排序和重复数据删除(即彼此独立),但是据我所知,sort
只能生成所有输入文件的串联输出-也就是说,即使给出多个文件,它也只会产生一个包含所有这些文件的合并结果的输出文件。
如何对当前文件夹中的所有文件进行排序以为每个文件夹生成单独排序的输出文件?我还希望将输出文件输出到当前目录中的子文件夹。一个for
循环是显而易见的解决方案给我,但我要问这里的情况下,有一些简单的方法以做到这一点sort
,我还没有碰到过或漏诊。我的bash
知识也很缺乏,所以如果for
循环是最简单的解决方案,我希望有人提供最好的解决方案,而不是我花很多时间一起破解某些东西,而这仍然达不到我想要做的事情。
是的,您可以使用完成此操作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
将sorted
目录作为参数运行(这将引发错误,无害但不优雅)。如果使用更具体的glob (例如*.txt
或*.db
而不是)*
(例如,跳过desktop.ini
不应处理的杂散文件),则很有可能不需要此测试。在这种情况下,您可以省略[ ... ] &&
并以该行开始sort
(尽管保持该行完好无损)。sort
支持各种选项,您可能需要使用其中一些选项,具体取决于您需要的排序方式。
sort -u
在对条目进行排序后立即对它们进行重复数据删除,并且在已经使用时,这sort
是使用该uniq
命令的一种较不冗余的选择。
如果您需要根据比简单的glob更复杂的条件来选择文件,find
那么开始可能会更好。对于您当前的任务for
应该没问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句