在线查找基于某些分隔文件的重复行

时间:2010-05-26 10:54:30

标签: duplicates field ksh partial lines

我有一个文件,其中的行包含一些由“|”分隔的字段。

我必须根据某些文件提取相同的行 (即找到包含字段1,2,3,12和13的相同值的行) 其他字段内容对搜索没有重要意义,但整个提取的行必须完整。

任何人都可以告诉我如何在KSH脚本中做到这一点 (通过一个带有一些参数(依赖于顺序)的脚本来定义fileds分隔符和必须进行比较的字段以查找输入文件中的重复行)

提前致谢并致以亲切的问候

奥利

2 个答案:

答案 0 :(得分:2)

根据匹配字段打印重复的行。它使用一个关联数组,根据输入文件的性质,它可能会变大。输出未排序,因此大多数重复项不会组合在一起(除了集合的前两个)。

awk -F'|' '{ idx=$1$2$3$12$13; if (array[idx] == 1) {print} else if (array[idx]) {print array[idx]; print; array[idx]=1} else {array[idx]=$0}}' inputfile.txt

您可以在包装器脚本中的shell变量中构建索引列表,如下所示:

#!/bin/ksh
for arg
do
    case arg in    # validate input (could be better)
        +([0-9]) ) # integers only
            idx="$idx'$'$arg"
            ;;
        * )
            echo "Invalid field specifier"
            exit
            ;;
    esac
done
awk -F'|' '{ idx='$idx'; if (array ...

您可以通过以下命令对输出进行排序:

awk ... | sort  --field-separator='|' --key=1,1 --key=2,2 --key=3,3 --key=12,12 --key=13,13

答案 1 :(得分:-1)

这会打印重复的行 - 每行只有一行:

awk -F'|' '!arr[$1$2$3$12$13]++' inputfile > outputfile