bashまたはシェルを使用してcsvファイルでSQL操作を実行する

bashまたはシェルを使用してcsvファイルでSQL操作を実行する

これは私の入力ファイルです。

0164318,001449,001452,001922  
0164318,001456,001457,001922  
0842179,002115,002118,001485  
0846354,001512,001513,001590  
0841422,001221,001224,001860  
0841422,001227,001228,001860

私の結果は

0164318,001449,001457,001922  
0842179,002115,002118,001485  
0846354,001512,001513,001590  
0841422,001221,001228,001860 


col1でグループ化し、シェルスクリプトを介してmin(col2)とmax(col3)を見つけます。

ベストアンサー1

使用csvkit

$ csvsql -H --query 'SELECT a,min(b),max(c),d FROM file GROUP BY a' file.csv
a,min(b),max(c),d
164318,1449,1457,1922
841422,1221,1228,1860
842179,2115,2118,1485
846354,1512,1513,1590

これはCSVデータを一時データベース(デフォルトではSQLiteと見なす)にロードし、与えられたSQLクエリをここに適用します。デフォルトでは、テーブルの名前は入力ファイルと同じ(サフィックスなし)、データに列ヘッダーがないため、デフォルトのフィールド名はアルファベット順に指定されます。

この-Hオプションは、csvsqlデータに列見出しがないことを示します。

生成されたヘッダーを出力から削除するには、次のようなものを渡しますsed '1d'

0 で埋められた整数を取得するには、次のようにします。

$ csvsql -H --query 'SELECT printf("%07d,%06d,%06d,%06d",a,min(b),max(c),d) FROM file GROUP BY a' file.csv
"printf(""%07d,%06d,%06d,%06d"",a,min(b),max(c),d)"
"0164318,001449,001457,001922"
"0841422,001221,001228,001860"
"0842179,002115,002118,001485"
"0846354,001512,001513,001590"

ここでは実際には結果レコードごとに1つの出力フィールドしか要求しないため(カンマを含む)、この行を引用しました。より多くの入力が必要ですが、追加の二重引用符を生成しない別のアプローチは次のとおりです。

$ csvsql -H --query 'SELECT printf("%07d",a),printf("%06d",min(b)),printf("%06d",max(c)),printf("%06d",d) FROM file GROUP BY a' file.csv
"printf(""%07d"",a)","printf(""%06d"",min(b))","printf(""%06d"",max(c))","printf(""%06d"",d)"
0164318,001449,001457,001922
0841422,001221,001228,001860
0842179,002115,002118,001485
0846354,001512,001513,001590

同様に、結果をパイピングして出力ヘッダーを削除できますsed '1d'

おすすめ記事