2

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

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

谁能告诉我如何在 KSH 脚本中做到这一点(例如一个带有一些参数(顺序依赖)的脚本,这些参数定义了文件分隔符和必须比较的字段以在输入文件中查找重复行)

预先感谢和亲切的问候

奥利

4

2 回答 2

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
于 2010-05-26T14:07:35.843 回答
-1

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

awk -F'|' '!arr[$1$2$3$12$13]++' inputfile > outputfile
于 2010-05-29T14:22:35.080 回答