特定の行列をgrepし、1行で印刷します。

特定の行列をgrepし、1行で印刷します。

以下にキーワードword1と行列を含むファイルがあります。word2word2ファイル.dat

  position1: [    0.0000000,    0.0000000,    0.0000000 ]
  word1:    0.0000000
  band:
  - # 1
    word2 :
    0.32015595   0.18484212   0.00000000
    0.00000000   0.36968424   0.00000000
    0.00000000   0.00000000   0.08286072 

  position2: [    0.5000000,    0.0000000,    0.0000000 ]
  word2:    0.0000000
  band:
  - # 1
    word2 :
    0.45015595   0.53484212   0.00000000
    0.00000000   0.36968424   0.00000000
    0.00000000   0.00000000   0.02476072 
    .
    .

では、次の形式でファイルを作成したいと思います。

position1 word1 word2
position2 word1 word2
.
.

しかし、ここで単一行のword2行列は次のようになります。

0.0000000 0.0000000 0.0000000  0.0000000    0.32015595   0.18484212 0.00000000 0.00000000   0.36968424   0.00000000 0.00000000   0.00000000 0.08286072 

おすすめを使用しました

awk '/ position | word1 | word2/ {w=w "$2" } END {print w}

しかし、期待した結果は出ません。誰でも私を助けることができますか?ありがとう

ベストアンサー1

$ awk -F': ' '/position[0-9]+:|word[0-9]+:/ {w=w" "$2 };
              /^[0-9. ]+$/ { w=w" "$0 };
              /^[[:blank:]]*$/ || eof {if (w) {gsub(/,/,"",w);print w;w=""}}' muthu.txt 
 [    0.0000000    0.0000000    0.0000000 ]    0.0000000     0.32015595   0.18484212   0.00000000     0.00000000   0.36968424   0.00000000     0.00000000   0.00000000   0.08286072 
 [    0.5000000    0.0000000    0.0000000 ]    0.0000000     0.45015595   0.53484212   0.00000000     0.00000000   0.36968424   0.00000000     0.00000000   0.00000000   0.02476072 

または(IMO)少し良いフォーマットを使用してください。

$ awk -F': ' '/position[0-9]+:/ {p=$2 };

              /word[0-9]+:/ {w=$2};

              /^[0-9. ]+$/ {
                  if (!w2) { w2="[" };
                  w2=w2" ["$0" ]"
              };

              /^[[:blank:]]*$/ || eof {
                  l=p" "w" "w2;
                  gsub(/  +/," ",l);
                  gsub(/,/,"",l);
                  if (l ~ /^[[:blank:]]*$/) {next};
                  print l" ]";
                  p=w=w2=""
              }' muthu.txt 
[ 0.0000000 0.0000000 0.0000000 ] 0.0000000 [ [ 0.32015595 0.18484212 0.00000000 ] [ 0.00000000 0.36968424 0.00000000 ] [ 0.00000000 0.00000000 0.08286072 ] ]
[ 0.5000000 0.0000000 0.0000000 ] 0.0000000 [ [ 0.45015595 0.53484212 0.00000000 ] [ 0.00000000 0.36968424 0.00000000 ] [ 0.00000000 0.00000000 0.02476072 ] ]

両方とも、入力が1つ以上の空白行で区切られた段落にあるとします。

おすすめ記事