5
2

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 1 year has passed since last update.

簡単♪ いっちょデータ抽出してみっか、grep/awk/sedで!!

Last updated at Posted at 2022-09-16

1. はじめに

大昔に覚えたはずなのに,すぐ忘れる。ので、備忘のため、複雑なテキストファイルから、欲しい情報を取り出すコマンドの例をまとめてみました。紹介するコマンドは、すべて、grep/awk/sed等を組み合わせた、たった一行のコマンド(いわゆるワンライナー)です。

(*) 構造解析/流体解析/安全解析/CAD・CAEやら、解析をやる人々向けの内容です。時短追い求める若者には必須の技術です。新たに、Unix/Linux/Cygwinにデビューする人々などにも参考になるかと思います。

中身知らなくても使えるぞ!まずは、触ってみよう!!やる事はコピペして実行するだけ!!!階段を登るように技術を吸収していこう♪♪

2. では本題!!

まずは、以下のテキストファイル(sample.txt)コピーして下さい。あとは、好きなコマンドを選んで、実行してみて下さい。「Linuxのターミナル」はもちろん、「WSL(Windows Subsystem for Linux)」でも、「Cygwin」でも、「Macのターミナル」でも、問題なく、動くかと思います。

sample.txt
*** Input ***
INP01=1.0E-01                    <-- #001
INP02 = 1.0E-02                  <-- #002
INP03: 1.0E-03                   <-- #003
*** End ***

*** Result 1 ***
ABC 1.100 DEF 2.100 GH I 3.100   <-- #004, #005, #006
DEF_11.00_GHI_22.00_JK L_33.00   <-- #007, #008, #009

KLM
111.0                            <-- #010

OPQ
222.0                            <-- #011
*** End ***

*** Result 2 ***
   X     Y
0.00  0.00                       <-- #012, #013
1.00  1.00                       <-- #012, #013
2.00  4.00                       <-- #012, #013
3.00  9.00                       <-- #012, #013
4.00 16.00                       <-- #012, #013
5.00 25.00                       <-- #012, #013
*** End ***

#001の数値(1.0E-01)だけを取り出す

cat sample.txt | cut -c1-33 | grep "INP01" | awk -F'=' '{print $2}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「INP01」を含む行だけ抽出 ⇒ awkで「=」で区切って,2番目の数値だけ抽出

#002の数値(1.0E-02)だけを取り出す

cat sample.txt | cut -c1-33 | grep "INP02" | awk '{print $3}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「INP02」を含む行だけ抽出 ⇒ awkで「 」(スペース)で区切って,3番目の数値だけ抽出

#003の数値(1.0E-03)だけを取り出す

cat sample.txt | cut -c1-33 | grep 'INP03' | awk -F':' '{print $2}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「INP03」を含む行だけ抽出 ⇒ awkで「:」で区切って,2番目の数値だけ抽出

#004の数値(1.100)だけを取り出す

cat sample.txt | cut -c1-33 | grep "ABC" | awk '{print $2}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「ABC」を含む行だけ抽出 ⇒ awkで「スペース」で区切って,2番目の数値だけ抽出

#005の数値(2.100)だけを取り出す

cat sample.txt | cut -c1-33 | grep "ABC" | awk '{print $4}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「ABC」を含む行だけ抽出 ⇒ awkで「 」(スペース)で区切って,4番目の数値だけ抽出

#006の数値(3.100)だけを取り出す

cat sample.txt | cut -c1-33 | grep "ABC" | awk '{print $7}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「ABC」を含む行だけ抽出 ⇒ awkで「 」(スペース)で区切って,7番目の数値だけ抽出

#007の数値(11.00)だけを取り出す

cat sample.txt | cut -c1-33 | grep "^DEF" | awk -F'_' '{print $2}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepで「行の頭にある」キーワード「DEF」を含むだけ行抽出 ⇒ awkで「_」で区切って,2番目の数値だけ抽出

#008の数値(22.00)だけを取り出す

cat sample.txt | cut -c1-33 | grep "^DEF" | awk -F'_' '{print $4}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepで「行の頭にある」キーワード「DEF」を含む行だけ抽出 ⇒ awkで「_」で区切って,4番目の数値だけ抽出

#009の数値(33.00)だけを取り出す

cat sample.txt | cut -c1-33 | grep "^DEF" | awk -F'_' '{print $6}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepで「行の頭にある」キーワード「DEF」を含む行だけ抽出 ⇒ awkで「_」で区切って,6番目の数値だけ抽出

#010の数値(111.0)だけを取り出す

cat sample.txt | cut -c1-33 | grep -A1 "KLM" | tail -1
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「KLM」を含む行とその次の1行を抽出 ⇒ tailで最後の1行だけ抽出

#011の数値(222.0)だけを取り出す

cat sample.txt | cut -c1-33 | grep -A1 "OPQ" | tail -1
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「OPQ」を含む行とその次の1行を抽出 ⇒ tailで最後の1行だけ抽出

#012の数値(0.00-5.00)だけを取り出す

cat sample.txt | cut -c1-33 | sed -n '/Result 2/,/End/p' | grep '[0-9][0-9]' | awk '{print $1}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「Result 2」を含む行と「End」を含む行に挟まれる行を抽出 ⇒ grepで数値(例えば「00」)を含む行だけを抽出 ⇒ awkで「 」(スペース)で区切って,1番目の数値だけ抽出

#013の数値(0.00-25.00)だけを取り出す

cat sample.txt | cut -c1-33 | sed -n '/Result 2/,/End/p' | grep '[0-9][0-9]' | awk '{print $2}'
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「Result 2」を含む行と「End」を含む行に挟まれる行を抽出 ⇒ grepで数値(例えば「00」)を含む行だけを抽出 ⇒ awkで「 」(スペース)で区切って,2番目の数値だけ抽出

#001, #002, #003の数値(1.0E-01, 1.0E-02, 1.0E-03)をまとめて取り出す

cat sample.txt | cut -c1-33 | grep "INP[0-9][0-9]" | awk -F'=' '{print $2}' 
コマンドの動作の流れ
catでテキスト表示 ⇒ cutで1文字目から33文字目まで抽出(「<-- #001」等を消す) ⇒ grepでキーワード「INP01」「INP02」「INP03」を含む行だけ抽出 ⇒ awkで「=」で区切って,2番目の数値だけ抽出

3. 気になってきたら!!

「grep」?なにそれ??おいしいの??? 指定した文字列を含む行を、一瞬で取り出すことができる、ちょー便利なコマンドです。正規表現を使った、曖昧検索なんかもできちゃいます。このあたり(https://atmarkit.itmedia.co.jp/ait/articles/1604/07/news018.html)読んでみると、グッと理解深まります。
「正規表現」ってなんだ? grepやsedなどで、曖昧な文字列を指定したい場合に使う記号です。例えば、「INP[0-9][0-9]」で、INP00やINP01など、INPと2桁の数字を組み合わせた文字列を指定することができます。暗号みたいで、最初はとっつきにくいですが、一度覚えてしまえば、データの処理が、とてつもなく楽になります。grep以外にも、いろいろなコマンドやPython等でも使えるので、少し時間をとって、覚えてみましょう。このあたり(https://atmarkit.itmedia.co.jp/ait/articles/0112/04/news003.html)読んでみると、グッと理解深まります。
「|」(パイプ)ってなんだ? 複数のコマンドを繋げる機能です。例えば、「grep」で文字列を取り出し、さらに、それを「cut」で分割する、みたいなことができます。いろいろなコマンド組み合わせると、複雑な処理も1行でこなせます。このあたり(https://atmarkit.itmedia.co.jp/ait/articles/1603/24/news018.html)読んでみると、グッと理解深まります。
「awk」って何?? 表形式のテキストから必要なデータを取り出したり、加工したりするコマンドです。例えば、「awk -F'_' '{print $6}'」で、「DEF_11.00_GHI_22.00_JK L_33.00」のような表形式の文字列を、「_」で区切って、その6番目の数値「33.00」を取り出す、みたいなことがやれます。一種のプログラミング言語みたいなもので、C言語などの通常のプログラミング言語などと同等、より複雑な処理をこなすことも可能です。エクセルでちまちま表形式のデータを処理するのに飽きたら、サクッと「awk」を覚えて、自動化してしまうのがおすすめです。このあたり(https://www.tohoho-web.com/ex/awk.html)読んでみると、グッと理解深まります。
「sed」?何それ?? テキストを行単位で取り出したり、加工したりするコマンドです。例えば、「sed -n '/Result 2/,/End/p'」で、「Result 2」を含む行から「End」を含む行までを取り出す、「sed 's/ABC/CDE/g'」で、テキストに含まれるすべての「ABC」を「CDE」に置換する、みたいなことができます。大量の入力ファイルを一気に変更したりするのに非常に便利です。このあたり(https://xtech.nikkei.com/it/article/COLUMN/20060228/231161/)読んでみると、グッと理解深まります。

4. 次のステップ

「シェル芸」、「ワンライナー」等でググってみましょう。美しいワンライナーがたくさん見つかるはずです。使いこなせるようになってくると、テキストのデータの処理やLinux/Unix等の操作がものすごく快適になります。

5. 最後に

生き物は必ず死を迎えます。それも、いつ訪れるのかわかりません。時間は有限です。その中で、如何にやりたいことを成し遂げるのか、その鍵は時間の使い方にあります。計算機にやれる仕事はすべて、計算機にやってもらいましょう。そして、自分にしかできないこと、やりたいことをやりましょう。

5
2
0

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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?