1

「colors.txt」というファイルの RGB 値のリストを次に示します。

255 222 0  
101 153 255  
255 153 0  
13  112 84  
13  112 84  
255 222 0  
13  112 84  
9   112 84  

awk 配列を使用して、ファイルから 5 つの一意の RGB の組み合わせを取得できます。

awk '{arr[($1","$2","$3)]} END {for (i in arr) print i}' colors.txt

これは与える:

9,112,84  
255,222,0  
13,112,84  
255,153,0  
101,153,255  

これらは、入力ファイル内の順序ではないことに注意してください。ただし、このコマンド

awk 'arr[($1","$2","$3)]++==0 {print ($1","$2","$3)}' colors.txt

255,222,0  
101,153,255  
255,153,0  
13,112,84  
9,112,84  

順序を保持します。これはどのように機能しますか?ここで 2 番目のコマンド バージョンを見つけました。

4

3 に答える 3

6

楽しみのために、それを awkish に組み合わせることができます。

awk '!A[$1=$1,$2,$3]++' OFS=, file
于 2013-03-06T09:37:33.517 に答える
4

この行:

awk '{arr[($1","$2","$3)]} END {for (i in arr) print i}' colors.txt

すべての入力を読み取った後にハッシュを出力します。ハッシュキーは順序を保持しないため、出力はまったく任意です。

このコマンド:

awk 'arr[($1","$2","$3)]++==0 {print ($1","$2","$3)}' colors.txt

ハッシュを使用して同じ組み合わせが以前に出力されたかどうかを確認しますが、 arr[($1","$2","$3)]0 の場合はすぐに入力を出力します。したがって、順序の保存はありません。これは、即時印刷に似ています。

于 2013-03-06T06:21:30.177 に答える
4

perrealは、順序が保持される理由を説明しています。このイディオムの細かい点に触れたいと思います。

  • hashスクリプト内に配列が 1 つしかない場合は、その名前を使用しhてその型を思い出す傾向があります。
  • コンマで区切られた配列添字は、 and で既に期待どおりに機能しますgawknawkつまり、 becomeです。のデフォルト値はまたはです。h[$1,$2,$3]h[$1 SUBSEP $2 SUBSEP $3]SUBSEP\0340x1c
  • !h[...]++よりも読みやすいと思いますh[...]++==0。多分それは私だけです。
  • OFS私は明示的な印刷よりも使用する$1=$1; printことを好みprint ($1","$2","$3)ます。

これらすべてをまとめると、次のようになります。

awk '!h[$1,$2,$3]++ { $1=$1; print }' OFS=',' colors.txt
于 2013-03-06T09:21:16.993 に答える