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

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


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


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


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


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


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


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


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


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


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


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


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


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


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


# 3. 気になってきたら！！
<details>
<summary>「grep」？なにそれ？？おいしいの？？？
</summary>
指定した文字列を含む行を、一瞬で取り出すことができる、ちょー便利なコマンドです。正規表現を使った、曖昧検索なんかもできちゃいます。このあたり(https://atmarkit.itmedia.co.jp/ait/articles/1604/07/news018.html)読んでみると、グッと理解深まります。
</details>

<details>
<summary>「正規表現」ってなんだ？
</summary>
grepやsedなどで、曖昧な文字列を指定したい場合に使う記号です。例えば、「INP[0-9][0-9]」で、INP00やINP01など、INPと2桁の数字を組み合わせた文字列を指定することができます。暗号みたいで、最初はとっつきにくいですが、一度覚えてしまえば、データの処理が、とてつもなく楽になります。grep以外にも、いろいろなコマンドやPython等でも使えるので、少し時間をとって、覚えてみましょう。このあたり(https://atmarkit.itmedia.co.jp/ait/articles/0112/04/news003.html)読んでみると、グッと理解深まります。
</details>

<details>
<summary>「|」(パイプ)ってなんだ？
</summary>
複数のコマンドを繋げる機能です。例えば、「grep」で文字列を取り出し、さらに、それを「cut」で分割する、みたいなことができます。いろいろなコマンド組み合わせると、複雑な処理も1行でこなせます。このあたり(https://atmarkit.itmedia.co.jp/ait/articles/1603/24/news018.html)読んでみると、グッと理解深まります。
</details>

<details>
<summary>「awk」って何？？
</summary>
表形式のテキストから必要なデータを取り出したり、加工したりするコマンドです。例えば、「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)読んでみると、グッと理解深まります。
</details>

<details>
<summary>「sed」？何それ？？
</summary>
テキストを行単位で取り出したり、加工したりするコマンドです。例えば、「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/)読んでみると、グッと理解深まります。
</details>

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

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