我有一个如下所示的文本文件。我想在第五列的字符和数字之间留一个空格。我怎样才能用 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
我有一个如下所示的文本文件。我想在第五列的字符和数字之间留一个空格。我怎样才能用 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
$ 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
这非常特定于您的数据格式,但它有效:
awk '{print substr($0,1,21)" "substr($0,22)}'
假设您的第五列以单个字符开头,
{
if(sub(/^./, "& ", $5)) {
print $0;
}
}
我还没有测试过,但我想这应该可以。
awk '{$5=substr($5,0,1)" "substr($5,1);print}' your_file