行にパターンが含まれている場合は、変数を列に印刷します。

行にパターンが含まれている場合は、変数を列に印刷します。

私はファイルを持っています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

おすすめ記事