コマンドでファイルの加工(grep,cut,sed,awk,sort)


はじめに

仕事でログファイルを整形することがあり、

sed、awkコマンドなどを初めて使用し、

試行錯誤したので忘れないようにまとめます。


やりたいこと

以下のfileA~Cの3ファイルから必要な情報を抽出し加工、

最終形のファイルを作成します。


fileA

20190501,comic,naruto,300円,100冊

20190201,novel,hibana,800円,20冊
20190301,magazine,rurubu,600円,25冊
20190401,picture,neko,800円,30冊


fileB

20190301,comic,bleach,400円,40冊

20190202,novel,gekijyou,800円,60冊
20190302,magazine,cancan,600円,30冊
20190402,picture,dog,800円,15冊


fileC

20190401,comic,onepiece,500円,80冊

20190103,novel,natunoniwa,800円,10冊
20190104,magazine,joker,600円,12冊
20190105,picture,rabit,800円,25冊


最終形

2019-03-01,bleach,400

2019-04-01,onepiece,500
2019-05-01,naruto,300


1、comicの行を抽出

まずはgrepコマンドを使用して各ファイルからcomicの行を検索して出力します。


grep

ディレクトリ・ファイルの文字列を正規表現で検索して表示するコマンド

書き方

grep オプション 正規表現 ファイル名

実行コマンド

grep -w "comic" file* > grep_result


grep_result

fileA:20190501,comic,naruto,300円,100冊

fileB:20190301,comic,bleach,400円,40冊
fileC:20190401,comic,onepiece,500円,80冊

各ファイルからcomicを含む行を抽出して出力出来ました。


2、必要な項目を抽出(日付、タイトル、値段)

次にcutコマンドを使用して日付、タイトル、値段を取り出します。


cut

指定した部分を切り出すコマンド

書き方

cut オプション 処理内容 ファイル名

実行コマンド

cut -d "," -f 1,3,4 grep_result > cut_result

-dのオプションでは区切り文字を指定できます。(今回はカンマを指定しました。)

-fのオプションで必要な項目数を指定できます。

なのでこのコマンドでは-dで指定したカンマで区切られた-fで指定した1,3,4番目を取り出してねというコマンドになります。


cut_result

fileA:20190501,naruto,300円

fileB:20190301,bleach,400円
fileC:20190401,onepiece,500円

必要項目が取り出せました。


3、ファイル名削除、値段の円を削除

sedコマンドを使用してfileA:と書いてある部分と値段の円が不要なので取ります。


sed

指定ファイルの中身を置換したり、抽出したりするコマンド

書き方

sed オプション 処理内容 ファイル名

実行コマンド

sed -e 's/円//g' -e 's/file[A-Z]://g' cut_result > sed_result

-e 条件式で指定した条件式で変換処理を行う事が出来ます。

条件式は次のように書くことが出来ます。

s/置換前文字列/置換後文字列/g

今回は円の部分とfileA:~fileC:の部分を空に置換しています。


sed_result

20190501,naruto,300

20190301,bleach,400
20190401,onepiece,500

ちゃんと置換出来ています。


4、日付をハイフン区切り

awkコマンドを使用して日付をハイフン区切りに加工します。


awk

1つ以上のスペースで区切られた複数列のテキストデータを色々処理するコマンド。

書き方

awk オプション 処理内容

実行コマンド

awk -F ',' 'BEGIN {OFS=","} {print substr($1, 1, 4) "-" substr($1, 5, 2) "-" substr($1, 7, 2) , $2, $3}' sed_result > awk_result

-Fで区切り文字を指定します。(これで指定した区切り文字を目印に加工します。今回はカンマ)

awkの出力は何も指定しないとスペースで区切られた結果が出力されます。

今回はカンマで区切りたいのでBEGIN {OFS=","}でカンマを指定します。

print $フィールドでそのフィールドを取り出せます。

今回はハイフンを途中に入れたいのでsubstr関数で1番目のフィールドから4桁、2桁、2桁を取り出して間にハイフンを入れています。


awk_result

2019-05-01,naruto,300

2019-03-01,bleach,400
2019-04-01,onepiece,500


5、日付順にソート

最後にsortコマンドで日付順に並び替えます。


sort

ファイルの中身の並び順をソートするコマンド

書き方

sort オプション ファイル名

実行コマンド

sort -k 1 -t "," awk_result > result

-tオプションで区切り文字、-kで区切った何番目のフィールドでソートするか指定します。

今回はカンマで区切った1番目のフィールド(日付)でソートしました。


result

2019-03-01,bleach,400

2019-04-01,onepiece,500
2019-05-01,naruto,300

完成!


おわりに

オプションも多く、どのコマンドが目的の達成に適しているのかを把握することに苦労しました。

もっとスマートに自在に操れるよう練習あるのみです。

また、正規表現の知識が乏しく仕事では時間がかかってしまったのでその辺りも勉強の必要があると痛感しました。