以递归方式从文件中删除重复的行

时间:2017-05-15 18:33:24

标签: bash csv awk

我有一堆包含csv文件的目录。我想从所有文件中删除重复行。

我尝试过awk解决方案但是对每个文件执行此操作似乎有点乏味。

awk '!x[$0]++' file.csv

即使我愿意 awk '!x[$0]++' *

我将丢失文件名。有没有办法只使用一个命令或脚本从所有文件中删除重复项。

只是澄清一下 如果目录中有3个文件,则输出应包含3个文件,每个文件独立排序。运行命令或脚本后,同一文件夹应包含3个文件,每个文件都有唯一的条目。

3 个答案:

答案 0 :(得分:0)

for f in dir/*; 
do awk '!a[$0]++' "$f" > "$f.uniq"; 
done

在测试后覆盖现有文件更改为:awk '!a[$0]++' "$f" > "$f.uniq" && mv "$f.uniq" "$f"

答案 1 :(得分:0)

这将创建新文件,后缀为.new,只有唯一的行:

gawk '!x[$0]++{print>(FILENAME".new")}' *.csv

工作原理

  • !x[$0]++

    这是一个条件。它的评估结果为真仅当前行$0,之前没有见过。

  • print >(FILENAME".new")

    如果条件的计算结果为true,则执行此print语句。它将当前行写入名称为当前文件名FILENAME的文件,后跟字符串.new

答案 2 :(得分:0)

使用GNU awk进行“inplace”编辑和输出文件的自动打开/关闭管理:

awk -i inplace '!seen[FILENAME,$0]++' *.csv