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