![对多个文件进行批量排序并从多个文件中删除重复行 - 如果可能的话就地进行](https://linux22.com/image/103161/%E5%AF%B9%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E6%89%B9%E9%87%8F%E6%8E%92%E5%BA%8F%E5%B9%B6%E4%BB%8E%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E8%A1%8C%20-%20%E5%A6%82%E6%9E%9C%E5%8F%AF%E8%83%BD%E7%9A%84%E8%AF%9D%E5%B0%B1%E5%9C%B0%E8%BF%9B%E8%A1%8C.png)
我有一个包含多个文本文件的文件夹。
apple.txt、book.txt、tooth.txt 等
我创建了一个包含多个 sed 命令的 bash 脚本来处理每个文本文件,如下所示:
...
find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
...
这些线路工作正常。
有没有一种方法可以以类似的方式(单个命令)处理所有单独的文本文件来执行这些操作:
从最长到最短的字符串对行进行排序(每一行包含一个字符串 - 没有空格)。
删除任何重复的行。
答案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 行将临时文件写入原始文件(因为在管道期间无法完成)。