1. はじめに
大昔に覚えたはずなのに,すぐ忘れる。ので、備忘のため、複雑なテキストファイルから、欲しい情報を取り出すコマンドの例をまとめてみました。紹介するコマンドは、すべて、grep/awk/sed等を組み合わせた、たった一行のコマンド(いわゆるワンライナー)です。
(*) 構造解析/流体解析/安全解析/CAD・CAEやら、解析をやる人々向けの内容です。時短追い求める若者には必須の技術です。新たに、Unix/Linux/Cygwinにデビューする人々などにも参考になるかと思います。
中身知らなくても使えるぞ!まずは、触ってみよう!!やる事はコピペして実行するだけ!!!階段を登るように技術を吸収していこう♪♪
2. では本題!!
まずは、以下のテキストファイル(sample.txt)コピーして下さい。あとは、好きなコマンドを選んで、実行してみて下さい。「Linuxのターミナル」はもちろん、「WSL(Windows Subsystem for Linux)」でも、「Cygwin」でも、「Macのターミナル」でも、問題なく、動くかと思います。
*** 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}'
コマンドの動作の流れ
#002の数値(1.0E-02)だけを取り出す
cat sample.txt | cut -c1-33 | grep "INP02" | awk '{print $3}'
コマンドの動作の流れ
#003の数値(1.0E-03)だけを取り出す
cat sample.txt | cut -c1-33 | grep 'INP03' | awk -F':' '{print $2}'
コマンドの動作の流れ
#004の数値(1.100)だけを取り出す
cat sample.txt | cut -c1-33 | grep "ABC" | awk '{print $2}'
コマンドの動作の流れ
#005の数値(2.100)だけを取り出す
cat sample.txt | cut -c1-33 | grep "ABC" | awk '{print $4}'
コマンドの動作の流れ
#006の数値(3.100)だけを取り出す
cat sample.txt | cut -c1-33 | grep "ABC" | awk '{print $7}'
コマンドの動作の流れ
#007の数値(11.00)だけを取り出す
cat sample.txt | cut -c1-33 | grep "^DEF" | awk -F'_' '{print $2}'
コマンドの動作の流れ
#008の数値(22.00)だけを取り出す
cat sample.txt | cut -c1-33 | grep "^DEF" | awk -F'_' '{print $4}'
コマンドの動作の流れ
#009の数値(33.00)だけを取り出す
cat sample.txt | cut -c1-33 | grep "^DEF" | awk -F'_' '{print $6}'
コマンドの動作の流れ
#010の数値(111.0)だけを取り出す
cat sample.txt | cut -c1-33 | grep -A1 "KLM" | tail -1
コマンドの動作の流れ
#011の数値(222.0)だけを取り出す
cat sample.txt | cut -c1-33 | grep -A1 "OPQ" | 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}'
コマンドの動作の流れ
#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}'
コマンドの動作の流れ
#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}'
コマンドの動作の流れ
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. 最後に
生き物は必ず死を迎えます。それも、いつ訪れるのかわかりません。時間は有限です。その中で、如何にやりたいことを成し遂げるのか、その鍵は時間の使い方にあります。計算機にやれる仕事はすべて、計算機にやってもらいましょう。そして、自分にしかできないこと、やりたいことをやりましょう。