CSVデータセットをフィルタリングして行を見つけてテキストファイルに保存する

CSVデータセットをフィルタリングして行を見つけてテキストファイルに保存する

私はシェルコマンドを初めて使用します。 CSVデータセットfbnews.csvに基づいて、この問題は少し混乱しています。

CSV データセットは次のとおりです。

D,E,F,   message,                 score,    A,B,C,   ID
d,e,f,  Let's read a book,           24,    a,b,c,    1
j,k,l,   Read this book,             39,    d,e,f,    2
m,n,o,   Have you read this book?,   15,    g,h,i,    3

これは単なる例です。元のデータセットには20,000,000行と20列が含まれています。

このデータセットから

  1. 「read」という単語が含まれ、スコアが20より大きい行を探します。 2.この行では、スコア値に基づいてソートされたスコアとID列のみを印刷します。
  2. これらのソートされた列をテキストファイルに保存します。

予想される出力は次のとおりです。

Score   ID
24      1
39      2

シェルコマンドを使用してこれをどのように実行できますか?

ベストアンサー1

ミラーの使用(https://github.com/johnkerl/miller)と

D,E,F,message,score,A,B,C,ID
d,e,f,Let's read a book,24,a,b,c,1
j,k,l,Read this book,39,d,e,f,2
m,n,o,Have you read this book?,15,g,h,i,3

そして走っている

mlr --csv filter -S '$message=~"(r|R)ead" && $score>20' then cut -f score,ID input.csv >output.csv

あなたはやる

score,ID
24,1
39,2

コマンドに関するいくつかの詳細は次のとおりです。

  • --csv、入力および出力フォーマットの設定
  • filter -S '$message=~"(r|R)ead" && $score>20'フィルタを適用
  • cut -f score,IDあなたの分野を選択してください

ヘッダー列よりもセルが多い誤ったCSVがある場合

D,E,F,message,score,A,B,C,ID
d,e,f,Let's read a book,24,a,b,c,1
j,k,l,Read this book,39,d,e,f,2,a wrong cell,another wrong cell
m,n,o,Have you read this book?,15,g,h,i,3

raggedオプションを適用して実行できます

mlr --csv --ragged unsparsify then filter -S '$message=~"(r|R)ead" && $score>20' then cut -f score,ID input.csv>output.csv

ただし、CSVに問題がある場合は、ここで内容全体を共有することをお勧めします。

おすすめ記事