awk 配列を印刷し、特殊文字をコンマで置き換えます。

awk 配列を印刷し、特殊文字をコンマで置き換えます。

タイトルがこれを正しく説明することを願っています。現在のスプレッドシートで一意の値を計算した後、配列を印刷しようとしています。

私のawkコマンドはうまくいきます。

awk -F"," 'NR>1{col[$1,$9]++} END {for (i in col) printf("%s: %d\n", i, col[i])}' my_file.csv | sort

印刷すると、疑問符のように見える特殊文字が表示されます。

出力

年と季節の間にカンマ + スペースを使用して印刷するにはどうすればよいですか?

例:1896、夏:151

答え1

awkは[$1,$9]これを擬似多次元配列として扱い、内部SUBSEP文字を挿入します。この内容は次のように記録されます。GNU Awkユーザーガイドたとえば、

サブセット

下付き文字の区切り記号。デフォルト値は「\ 034」で、多次元配列のインデックス部分を区切るために使用されます。したがって、 'foo["A", "B"]' 式は実際には foo["A\034B"] にアクセスします (多次元配列セクションを参照)。

前任者。

$ echo 'A,A' | gawk -F, '{col[$1,$2]++} END{for(i in col) print i}' | od -to1
0000000 101 034 101 012
0000004

文字列のリテラル値でインデックス付けされた1D配列が必要な場合、[$1 "," $9]またはより一般的なアプローチを使用できます[$1 FS $9](後者は、異なる区切り文字を持つデータに対してソリューションが機能することを保証します)。

$ echo 'A,A' | gawk -F, '{col[$1 FS $2]++} END{for(i in col) print i}'
A,A

カンマ + スペースが必要な場合は、block を有効または設定してください[$1 FS" " $2]SUBSEP = FS" "BEGIN

答え2

$1,$9配列と同じインデックスを使用するときにawk使用される実際のインデックスは、実際のデータに現れる可能性のない文字がある$1 SUBSEP $9場所です(実際の値は実装によって定義されますが、8進数34、「」という文字)。SUBSEPファイル区切り記号これは標準にawk1次元配列しかないためです。多次元配列はインデックスを連結し、このSUBSEP値を区切り文字として「シミュレート」します。

GNUにはawk実際の多次元配列がありますが、構文は[i][j]ありません[i,j]

この値に対してインデックスを分割すると、インデックスの生ビットが返されることがありますSUBSEP

for (i in col) {
    split(i, k, SUBSEP)
    year   = k[1]
    season = k[2]

    printf "%s, %s: %s\n", year, season, col[i]
}

そうでなければ

for (i in col) {
    split(i, k, SUBSEP)
    printf "%s, %s: %s\n", k[1], k[2], col[i]
}

上記の両方のフラグメントは、インデックスにi常に次のものが含まれていることがわかっているとします。二つ部分。

関連情報