以下を含む入力ファイルがあります。
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でスクリプトを書いています
sed -e 's/,/ , /g' <filename> | awk '{print $1}' | sort | uniq -d
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...
このスクリプトは、複数回繰り返される最初の列の番号のみを出力します。
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
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 を使用したソリューションもあります (上記を参照)。