プログラムの出力から.csvファイルを作成したいと思います。元の出力の一部をこのレベルにカスタマイズしました。
36.343074719185125 -1.488697037254009 0.517768286726280 -1.488697037254009 48.906350248447872 -0.255764113311881 0.51776828
6726280 -0.255764113311881 31.687963239227631
これまで、私はこれらのコマンドを使用してきました。
tail -12 Q.out | head -3 | sed 's/^........//' | tr -d '\n' > q.txt
問題は、その間に特定の数のスペースがないことです。 4つの時もあり、3つの時もあります。それはすべてプログラムの出力に依存します。たとえば、最初の値が36.343の場合は2つのスペース、3.6の場合は3つのスペース、360.34の場合は1つのスペースの前に付けます。もっときれいにする方法はありませんか?
生データ
0 1 2
0 36.343074719185125 -1.488697037254009 0.517768286726280
1 -1.488697037254009 48.906350248447872 -0.255764113311881
2 0.517768286726280 -0.255764113311881 31.687963239227631
alpha_(0.000) = 38.979129402287 a.u.
FCHKWriter: !WARNING! method 'CCSD'' renamed to label 'CC'.
FCHKWriter: Writing 0100-A_ccsd.fchk with label ' CC Density'.
Psi4 stopped on: Tuesday, 12 October 2021 04:09PM
Psi4 wall time for execution: 0:17:43.19
*** Psi4 exiting successfully. Buy a developer a beer!
予想される結果
36.343074719185125,-1.488697037254009,0.517768286726280,-1.488697037254009,48.906350248447872,-0.255764113311881,0.51776828
6726280,-0.255764113311881,31.687963239227631
Ubuntu 20.04を使用しています
ベストアンサー1
関心のあるデータの3行が元のデータの行4、5、6で、これらすべての数字をカンマ区切りリストで1行に入力するとします。
次の式は、sed
目的の行範囲内にないすべての行を削除し、数字のみを含む最初の列を削除します。このtr
コマンドはこのデータを読み取り、データを1行に1つずつ数値リストに変換します。改行で区切られた数字は、カンマで区切られたリストに変換されますpaste
。
sed -e '4,6 !d' \
-e 's/[[:blank:]]*[[:digit:]]*[[:blank:]]*//' file |
tr -s ' ' '\n' |
paste -s -d, -
tr
sed
繰り返されるスペースを単一のカンマで置き換えることで、それらを削除できます。
sed -e '4,6 !d' \
-e 's/[[:blank:]]*[[:digit:]]*[[:blank:]]*//' \
-e 's/[[:blank:]]\{1,\}/,/g' file |
paste -s -d, -