1

以下を含む入力ファイルがあります。

123,apple,orange
123,pineapple,strawberry
543,grapes,orange
790,strawberry,apple
870,peach,grape
543,almond,tomato
123,orange,apple

出力を次のようにしたい: 次の数字が繰り返される: 123 543

awk を使用してこの出力を取得する方法はありますか? 私はsolaris、bashでスクリプトを書いています

4

4 に答える 4

3
sed -e 's/,/ , /g' <filename> | awk '{print $1}' | sort | uniq -d
于 2013-08-17T16:48:56.740 に答える
1

awk なしで生活できる場合は、これを使用して繰り返し番号を取得できます。

cut -d, -f 1 my_file.txt  | sort | uniq -d

版画

123
543

編集:(あなたのコメントに応じて)

出力をバッファリングして、続行するかどうかを決定できます。例えば:

out=$(cut -d, -f 1 a.txt | sort | uniq -d | tr '\n' ' ')
if [[ -n $out ]] ; then
    echo "The following numbers are repeated: $out"
    exit
fi

# continue...
于 2013-08-17T16:47:18.390 に答える
1

このスクリプトは、複数回繰り返される最初の列の番号のみを出力します。

awk -F, '{a[$1]++}END{printf "The following numbers are repeated: ";for (i in a) if (a[i]>1) printf "%s ",i; print ""}' file

または少し短い形式で:

awk -F, 'BEGIN{printf "Repeated "}(a[$1]++ == 1){printf "%s ", $1}END{print ""} ' file

重複が見つかった場合にスクリプトを終了する場合は、ゼロ以外の終了コードを終了できます。例えば:

awk -F, 'a[$1]++==1{dup=1}END{if (dup) {printf "The following numbers are repeated: ";for (i in a) if (a[i]>1) printf "%s ",i; print "";exit(1)}}' file

メイン スクリプトでは、次のことができます。

awk -F, 'a[$1]++==1{dup=1}END{if (dup) {printf "The following numbers are repeated: ";for (i in a) if (a[i]>1) printf "%s ",i; print "";exit(-1)}}' file || exit -1

または、より読みやすい形式で:

awk -F, '
    a[$1]++==1{
        dup=1
    }
    END{
        if (dup) {
            printf "The following numbers are repeated: ";
            for (i in a) 
                if (a[i]>1) 
                    printf "%s ",i; 
            print "";
            exit(-1)
        }
    }
' file || exit -1
于 2013-08-17T16:47:27.733 に答える
1
awk -vFS=',' \
     '{KEY=$1;if (KEY in KEYS) { DUPS[KEY]; }; KEYS[KEY]; }   \
      END{print "Repeated Keys:"; for (i in DUPS){print i} }' \
< yourfile

sort/uniq/cut を使用したソリューションもあります (上記を参照)。

于 2013-08-17T16:48:47.340 に答える