0

我有一个如下所示的文本文件。我想在第五列的字符和数字之间留一个空格。我怎样才能用 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

4 回答 4

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 标志,但对于较新的 gawk,RE-intervals ({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

您可以使用一对 sub() 在任何 awk 中执行类似操作,但它很难看,因此我将 match()/substr() 用于这些 awk。

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

$ awk 'sub(/.{21}/,"& ")' file
cxe  911  bv  heg   A 1029   53.030
bvf  912  cv  lya   A 1030   51.99
于 2012-12-16T16:45:12.620 回答
1

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

awk '{print substr($0,1,21)" "substr($0,22)}'
于 2012-12-16T04:27:00.110 回答
0

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

{
  if(sub(/^./, "& ", $5)) {
    print $0;
  } 
} 
于 2012-12-16T04:29:22.213 回答
0

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

awk '{$5=substr($5,0,1)" "substr($5,1);print}' your_file
于 2012-12-16T13:18:51.510 回答