我有一个文本文件,如下所示。我想在第五列中的字符和数字之间给出一个空格。我怎么能用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
答案 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