对多个文件进行批量排序并从多个文件中删除重复行 - 如果可能的话就地进行

对多个文件进行批量排序并从多个文件中删除重复行 - 如果可能的话就地进行

我有一个包含多个文本文件的文件夹。

apple.txt、book.txt、tooth.txt 等

我创建了一个包含多个 sed 命令的 bash 脚本来处理每个文本文件,如下所示:

    ...
    find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
    ...

这些线路工作正常。

有没有一种方法可以以类似的方式(单个命令)处理所有单独的文本文件来执行这些操作:

  1. 从最长到最短的字符串对行进行排序(每一行包含一个字符串 - 没有空格)。

  2. 删除任何重复的行。

答案1

我不确定单个命令的要求是什么,但这非常接近:

(cd /directory/; find -type f -printf '%P\0' | while IFS= read -r -d '' fn; do
    awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
    mv "$fn.~" "$fn"
done)

第一行只是以尽可能稳健的方式读取文件名。

第二行是所有工作发生的地方:

  • awk 在每行的开头添加字符数(+ 空格)
  • sort -n(数字)、-u(唯一)和 -r(反向)处理文件
  • sed 删除前导字符计数
  • 然后它被转储到临时文件

然后 mv 行将临时文件写入原始文件(因为在管道期间无法完成)。

相关内容