私はファイルを持っていますDEMLIR-GEO_OPT-1-distance-1.coordLog
:
REQUESTED STRUCTURE DATA
Distance vector r(i,j) between the atom i and j in ANGSTROM
r(1,5) = 0.944776 0.190651 1.602108 |r| = 1.869679
r(2,5) = -0.693580 -0.927860 -1.000974 |r| = 1.530989
r(2,8) = 1.618580 0.570765 -0.688275 |r| = 1.849134
REQUESTED STRUCTURE DATA
Distance vector r(i,j) between the atom i and j in ANGSTROM
r(1,5) = 0.945905 0.187745 1.601950 |r| = 1.869821
r(2,5) = -0.692409 -0.928976 -1.001505 |r| = 1.531483
r(2,8) = 1.618487 0.572023 -0.688769 |r| = 1.849626
REQUESTED STRUCTURE DATA
Distance vector r(i,j) between the atom i and j in ANGSTROM
r(1,5) = 0.946708 0.186226 1.601724 |r| = 1.869881
r(2,5) = -0.691970 -0.929421 -1.002033 |r| = 1.531900
r(2,8) = 1.618395 0.572685 -0.688576 |r| = 1.849678
ファイルの各行を読み、パターンが含まれている場合は、r(1,5)
次の値を印刷したいと思います|r| =
。これまで、次のコードを書きました。
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
exec 0<"DEMLIR-GEO_OPT-1-distance-1.coordLog"
while read -r line
do
for j in $(seq 0 2)
do
if [[ "$line" == *"r(1,5)"* ]] ; then
dist1=$(gawk 'BEGIN{FS="|r| ="} {print $2}' | tr -s " ")
elif [[ "$line" == *"r(2,5)"* ]] ; then
dist2=$(gawk 'BEGIN{FS="|r| ="} {print $2}' | tr -s " ")
elif [[ "$line" == *"r(2,8)"* ]] ; then
dist3=$(gawk 'BEGIN{FS="|r| ="} {print $2}' | tr -s " ")
fi
printf "%-3f %-3f %-3f %-3f\n" "1.$j" "$dist1" "$dist2" "$dist3"
done
done>DEMLIR_task.txt
ただし、次のエラーが発生します。
dist1: unbound variable
1.0行には到達しませんが、"1.$j"
エラーも発生することを知っています。
私もsed
欲しいものを手に入れようとしましたが、それは次のようになります:
sed -n '/r(1,5)/p' DEMLIR-GEO_OPT-1-distance-1.coordLog> new
sed -i 's/^.*|r| =//' new
これにより、新しいファイルにそれ以降の値が印刷され|r| =
、ifステートメントで見られるように、他の2つの条件に対しても同じことを行う必要があることを考慮すると、不要なファイルが多すぎます。私はそれをしたくありません。
私は最初の作業方法が欲しい。どうすればいいですか?
編集する
r(1,5)
0,1,2の距離を最初の列、2番目、3r(2,5)
番目、4番目の列に印刷したいと思います。新しいファイルを作成したり元のファイルを変更せずにこれを実行したいと思います。私が望む出力は次のとおりです。r(2,8)
DEMLIR_task.txt
0 1.869679 1.530989 1.849134
1 1.869821 1.531483 1.849626
2 1.869881 1.531900 1.849678
ベストアンサー1
考えられる解決策はawk
のみです。私は一つを作りましたprg.awk
:
BEGIN { j=0; }
{
if ( $1 == "r(1,5)" )
{
dist1=$8;
}
if ( $1 == "r(2,5)" )
{
dist2=$8;
}
if ( $1 == "r(2,8)")
{
dist3=$8;
print j": "dist1" "dist2" "dist3;
++j;
}
}
コンテンツfile.txt
:
yurijs-MacBook-Pro:bash yurij$ cat ./file.txt
REQUESTED STRUCTURE DATA
Distance vector r(i,j) between the atom i and j in ANGSTROM
r(1,5) = 0.944776 0.190651 1.602108 |r| = 1.869679
r(2,5) = -0.693580 -0.927860 -1.000974 |r| = 1.530989
r(2,8) = 1.618580 0.570765 -0.688275 |r| = 1.849134
REQUESTED STRUCTURE DATA
Distance vector r(i,j) between the atom i and j in ANGSTROM
r(1,5) = 0.945905 0.187745 1.601950 |r| = 1.869821
r(2,5) = -0.692409 -0.928976 -1.001505 |r| = 1.531483
r(2,8) = 1.618487 0.572023 -0.688769 |r| = 1.849626
REQUESTED STRUCTURE DATA
Distance vector r(i,j) between the atom i and j in ANGSTROM
r(1,5) = 0.946708 0.186226 1.601724 |r| = 1.869881
r(2,5) = -0.691970 -0.929421 -1.002033 |r| = 1.531900
r(2,8) = 1.618395 0.572685 -0.688576 |r| = 1.849678
プログラムを実行します。
yurijs-MacBook-Pro:bash yurij$ awk -f prg.awk ./file.txt
0: 1.869679 1.530989 1.849134
1: 1.869821 1.531483 1.849626
2: 1.869881 1.531900 1.849678