最初の列として計算し、2番目の列で固有値を計算し、最初の列に出力をグループ化しますか?

最初の列として計算し、2番目の列で固有値を計算し、最初の列に出力をグループ化しますか?

CSVファイル(7億行以上)を読み取るにはUnixコマンドが必要です。例は次のとおりです。

A, 10
B, 11
C, 12
A, 10
B, 12
D, 10
A, 12
C, 12

このコマンドは、最初の列の発生回数を計算し、2 番目の列の個々の発生回数を計算し、最初の列の項目別に出力をグループ化します。出力は次のとおりです。

A, 3, 2
B, 2, 2
C, 2, 1
D, 1, 1 

ベストアンサー1

出力の最初の 2 つの列を取得するには、次のようにします。

$ cut -d, -f1 <file | sort | uniq -c | awk -vOFS=, '{ print $2, $1 }'
A,3
B,2
C,2
D,1

元のファイルの最初の列を抽出してソートし、重複する項目数を計算します。最後にawk列を変更し、その間にカンマを挿入します。

最後の列に

$ sort -u <file | cut -d, -f1 | uniq -c | awk -vOFS=, '{ print $1 }'
2
2
1
1

これにより、元のデータがソートされ、重複したデータが削除されます。次に、最初の列と重複回数を抽出します。それ計算されます。最後に、数だけawk抽出されます。

以下を使用bashして組み合わせますpaste

$ paste -d, <( cut -d, -f1 <file | sort    | uniq -c | awk -vOFS=, '{ print $2, $1 }' ) \
            <( sort -u <file | cut -d, -f1 | uniq -c | awk -vOFS=, '{ print $1 }' )
A,3,2
B,2,2
C,2,1
D,1,1

データを事前に並べ替えると、この速度がやや短くなり、はるかに高速になる可能性があります。

$ sort -o file file

$ paste -d, <( cut -d, -f1 <file        | uniq -c | awk -vOFS=, '{ print $2, $1 }' ) \
            <( uniq <file | cut -d, -f1 | uniq -c | awk -vOFS=, '{ print $1 }' )
A,3,2
B,2,2
C,2,1
D,1,1

おすすめ記事