对文件夹中的所有文件进行独立排序,每个文件都有一个输出文件

对文件夹中的所有文件进行独立排序,每个文件都有一个输出文件

我有几个文件夹,里面包含大量文本文件,从几十到几百个不等。这些文本文件是包含数百万行的简单数据库,每行包含一条记录。但是,其中的记录未排序,并且包含许多重复项。我想对它们进行单独排序和重复数据删除(即彼此独立),但据我了解,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应该没问题。

相关内容