我们使用 Redhat Linux 7.9 和bsh
.
我想浏览一个数据文件,并将第 10 列和第 20 列之间有空格的所有字段替换为 0。
因此,如果我有一个示例文件:
#######################
#######################
#######################
######### ######
#######################
#######################
#######################
#######################
我希望脚本看起来像:
#######################
#######################
#######################
#########000000000#####
#######################
#######################
#######################
#######################
我尝试过使用以下内容:
awk '{val=substr($0,10,9);gsub(val," ","000000000")}1' scr1
但它只返回原始文件。我错过了什么?
答案1
Perl 可以对此进行简短的处理,如图所示。
由于 Perl 索引从 0 开始,因此第 10 列是 9,并且 col10...20 有 20-10+1=11 个元素。
$ perl -lpe 'substr($_, 9, 11) =~ tr/ /0/' file
输出:-
#######################
#######################
#######################
12345678901234567890
#########00000000000###
12345678901
#######################
#######################
答案2
您的gsub()
参数顺序和含义错误,请参阅手册页。
看起来这可能就是您想要做的事情,在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ awk '{val=substr($0,10,9)} gsub(/ /,0,val){$0=substr($0,1,9) val substr($0,19)} 1' file
#######################
#######################
#######################
#########00000000######
#######################
#######################
#######################
#######################