CSVデータセットをテキストデータセットに

CSVデータセットをテキストデータセットに

1000行と10列を含むCSVデータセットStudent.csvがあります。

サンプルデータは次のとおりです。

s_id,s_name,s_dob,s_class,s_marks,s_parentname,
   1,abc,1/1/18,5,49,def,
   2,xyz,1/1/17,4,85,abc,
   3,pqr,1/2/18,2,78,mnp,

このデータセットでは、行に「abc」を含むすべての日付をテキストファイルにコピーしたいと思います。

予想出力:

text.txt
1/1/18
1/1/17

答え1

grep abc student.csv | cut -d, -f 3 >text.txt

これにより、最初にどこからでも部分student.csv文字列を含むすべての行を抽出し、そのabc行から3番目のカンマ区切りの列を削除して保存しますtext.txt

質問に提供されたデータに基づいて、最終的text.txtに次のものが含まれます。

1/1/18
1/1/17

これは元のファイルによって異なります。シンプルCSVファイル、つまりカンマまたは改行を含むフィールドはありません。

検索したいabc項目完全な言葉grep -w abc代わりにjustを使用してくださいgrep abc。これにより、などの文字列を含む行の一致は防止されますが、埋め込みabcdeフィールドとはまだ一致しますabc xyz

任意の複雑な文字列(まだ単純なCSVファイルにある)を含むフィールドを探し、フィールドがその文字列とまったく同じである必要がある場合は、各行のフィールドを繰り返す必要があります。

string='some string' awk -F, '{ for (i = 1; i <= NF; ++i) if ($i == ENVIRON["string"]) { print $3 ; next } }' student.csv

このawkコードは各行のすべてのフィールドを繰り返し、値が環境変数の値とまったく同じカンマで区切られたフィールドを見つけますstring。そのフィールドが見つかると、3番目のフィールドが印刷されます。

答え2

ミラーの使用(https://github.com/johnkerl/miller)から始める

s_id,s_name,s_dob,s_class,s_marks,s_parentname,
1,abc,1/1/18,5,49,def,
2,xyz,1/1/17,4,85,abc,
3,pqr,1/2/18,2,78,mnp,

そして走っている

mlr --nidx --fs "," filter -S '$2=="abc"' then cut -f 3 input.txt >output.txt

あなたはやる

1/1/18

答え3

ゲーム全体が必要であることを考慮すると、次のようになります。

$ awk -F, 'FNR==1{print FILENAME} /(^|,)abc(,|$)/{print $3}' file
file
1/1/18
1/1/17

あるいは、abc文字通り処理したいREメタ文字が実際に含まれている可能性があるため、正規表現の一致ではなく文字列を実行する必要があります。

$ awk -F, 'FNR==1{print FILENAME} index(","$0",",",abc,"){print $3}' file
file
1/1/18
1/1/17

または列ヘッダーを印刷します。

$ awk -F, 'FNR==1{print $3} /(^|,)abc(,|$)/{print $3}' file
s_dob
1/1/18
1/1/17

$ awk -F, 'FNR==1{print $3} index(","$0",",",abc,"){print $3}' file
s_dob
1/1/18
1/1/17

関連情報