小さなコードを変更した後、「awk」はタイトルと空白行を印刷します(タイトルの繰り返しなし)。

小さなコードを変更した後、「awk」はタイトルと空白行を印刷します(タイトルの繰り返しなし)。

data-fileコンテンツ:

             k = 0.1667 0.0962 0.0000 (  4922 PWs)   bands (ev):

-7.1689  -7.1043  -6.1682  -6.0658   1.1309   1.5196   3.0894   3.1087
 3.3846   3.7588   4.2143   4.2220   4.3882   4.4011   5.1222   5.6229
 5.9506   6.2078   8.4442   8.8100   8.8150   8.8529   8.9070   9.0070
 9.5911   9.6311  13.5626  14.3720  15.0169  15.2435 
  end1
  end2
  end3

awkこのデータに対して2つのコマンドを試しました...

1.

awk -F'=' '/[[:blank:]]k/{w=w""$2}; { print w}' data-file

出力:

     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :
     0.1667 0.0962 0.0000             matrix :

2.

awk -F'=' '/[[:blank:]]k/{w=w""$2}; { print w;w=""}' data-file

出力:

0.1667 0.0962 0.0000 (  4922 PWs)   bands (ev):











(Eight newlines are printed after that.)

2番目のコマンドを使用すると、検索されたパターンは一度だけ印刷されますが、空白行がより多く表示されます。ただし、最初のコマンドはパターンを9回印刷します。コマンドの違いは何ですかawk?もっと印刷する理由、空白行を印刷する理由は何ですか? これらの空白行の印刷をどのように抑制できますか?

答え1

なぜもっと印刷されますか?

スクリプトawkにはモードのない操作があります。つまり、各入力行に対して実行されます。何度も検索されたパターンを印刷したくない場合しないでください。

空白行を印刷する理由

印刷wしてから設定するからですw=""。その後、w各入力行に対して再印刷します。

このような漠然とした質問のため、明確に説明するのは難しいですが、推測するあなたはこれをしたいと思います:

awk -F'=' '/[[:blank:]]k/{ print $2 }' data-file

答え2

{print w;w=""}空でない行のみを印刷するには、w何かを含む{print...}条件で実行する必要があります。w

便利には、awk空の文字列は次のように処理され、空でないfalseすべての文字列はtrue「真実と偽りawk)。したがって、wパターンとして追加して必要なものを得ることができます。

awk -F'=' '/[[:blank:]]k/{w=w""$2}; w { print w;w=""}'

関連情報