2

「|」で区切られたいくつかのフィールドを持つ行を含むファイルがあります。

いくつかのフィールドに基づいて同一の行を抽出する必要があります (つまり、フィールド 1、2、3、12、および 13 に同じ値を含む行を見つけます) 他のフィールドの内容は検索にとって重要ではありませんが、抽出された行全体には完全であること。

KSHスクリプトでそれを行う方法を誰かに教えてもらえますか(入力ファイルの重複行を見つけるために比較する必要があるフィールドセパレーターとフィールドを定義するいくつかの引数(順序に依存する)を持つスクリプトの例)

よろしくお願いいたします。

オリ

4

2 に答える 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

おそらく、次のようなラッパースクリプトのシェル変数でインデックスリストを作成できます。

#!/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

これにより、複製された行が出力されます。各行は1行だけです。

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