如何在列之间留出空间?

时间:2012-12-16 04:07:57

标签: awk

我有一个文本文件,如下所示。我想在第五列中的字符和数字之间给出一个空格。我怎么能用awk做到这一点?

cxe  911  bv  heg   A1029   53.030
bvf  912  cv  lya   A1030   51.99

Desired output

cxe  911  bv  heg   A 1029   53.030
bvf  912  cv  lya   A 1030   51.99

4 个答案:

答案 0 :(得分:3)

$ awk 'match($0,/([^[:space:]]+[[:space:]]+){4}[^[:space:]]/) {
         print substr($0,1,RLENGTH), substr($0,RLENGTH+1) }' file
cxe  911  bv  heg   A 1029   53.030
bvf  912  cv  lya   A 1030   51.99

上面的“4”是您感兴趣的列之前的列数,即第5列。如果您想在不同的领域进行操作,只需以明显的方式更改该数字。

如果您使用的是较旧版本的gawk,则需要添加--re-interval标志,但对于较新的gawks,默认情况下会启用RE间隔({4})。

此外,如果您愿意,这里有一个简短但GNU-awk特定的解决方案:

$ awk '{print gensub(/(([^[:space:]]+[[:space:]]+){4}[^[:space:]])(.*)/,"\\1 \\3","")}' file
cxe  911  bv  heg   A 1029   53.030
bvf  912  cv  lya   A 1030   51.99

你可以在任何awk中使用一对sub()来做类似的但是它很难看,所以我会对那些awks使用match()/ substr()。

最后,如果像其他人发布的那样,你想要一个解决方案,在每一行的第21个字符之后添加空格,而不是在每行的第5个字段中的第一个字符之后添加空格,那么那只是:

$ awk 'sub(/.{21}/,"& ")' file
cxe  911  bv  heg   A 1029   53.030
bvf  912  cv  lya   A 1030   51.99

答案 1 :(得分:1)

这非常特定于您的数据格式,但它有效:

awk '{print substr($0,1,21)" "substr($0,22)}'

答案 2 :(得分:0)

假设您的第五列以单个字符开头,

{
  if(sub(/^./, "& ", $5)) {
    print $0;
  } 
} 

答案 3 :(得分:0)

我没有测试过,但我想这应该可行。

awk '{$5=substr($5,0,1)" "substr($5,1);print}' your_file