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