9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-20

##はじめに

仕事でログファイルを整形することがあり、
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

完成!

##おわりに
オプションも多く、どのコマンドが目的の達成に適しているのかを把握することに苦労しました。
もっとスマートに自在に操れるよう練習あるのみです。
また、正規表現の知識が乏しく仕事では時間がかかってしまったのでその辺りも勉強の必要があると痛感しました。

9
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?