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=""}'