使用awk为文本第二列及以后的所有数字(含浮点数)加1
实现文本中第二列及以后所有数字(整数/浮点数)加1的awk命令
问题场景
需要对示例文件中第二列及之后的所有数字(包括整数和浮点数)执行加1操作,原始文件内容如下:
ignore the headers chrX:73829232:-::chrX:73831065:- 76.5382 76.3422020852288 chrX:73827985:-::chrX:73829067:- 60.0702 0
原尝试的awk命令仅能处理整数,无法对浮点数生效:
awk -v OFS='\t' '{for(i=2;i<=NF;i++)if($i~/^[0-9]+$/) $i+=1}1' file.txt
执行后输出:
ignore the headers chrX:73829232:-::chrX:73831065:- 76.5382 76.3422020852288 chrX:73827985:-::chrX:73829067:- 60.0702 1
期望输出是所有第二列及以后的数字(无论整数还是浮点数)都加1:
ignore the headers chrX:73829232:-::chrX:73831065:- 77.5382 77.3422020852288 chrX:73827985:-::chrX:73829067:- 61.0702 1
解决方案
修改awk命令,去掉对数字格式的正则判断,直接利用awk自动识别数值类型的特性,对第二列及以后的字段执行加1操作:
awk -v OFS='\t' '{for(i=2;i<=NF;i++) $i += 1}1' example.txt
解释
- awk会自动将字符串形式的整数、浮点数转换为数值类型进行运算,不需要额外的正则匹配来判断是否为整数。
- 原命令中的
if($i~/^[0-9]+$/)限制了仅匹配纯整数,导致浮点数被跳过,移除这个判断后,所有能被识别为数值的字段都会被加1。 OFS='\t'确保输出时字段用制表符分隔,和原格式保持一致。- 末尾的
1是awk的简写,代表执行print $0,输出处理后的整行内容。
内容的提问来源于stack exchange,提问作者Shafaque Zahra
相关产品推荐
相关产品推荐

