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
我对此数据尝试了两个命令......
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.)
使用第二个命令,搜索到的模式仅打印一次,但有更多空行。但第一个命令将模式打印九次。命令之间有什么区别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=""}'