小代码更改后“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我对此数据尝试了两个命令......

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

相关内容