如何在Bash中将表格非首列数据除以同一个常量
处理表格数据:将指定列除以常量的方法
如果你需要把这组空格分隔的表格数据中,除第一列外的所有数值列除以同一个常量(比如3),这里有两种实用的解决方案,分别适合命令行快速处理和Python脚本灵活扩展的场景:
方法1:用awk命令行工具(高效快捷)
如果你的数据是每行4个字段(比如存储在input.txt文件中),直接用一行awk命令就能完成:
awk -v div=3 '{printf "%s", $1; for(i=2;i<=NF;i++) printf " %.3f", $i/div; print ""}' input.txt
如果你的原始数据是一串连续的字符串(就像你给出的那样),可以先分割成每行4个字段再处理:
echo "ERR843978.746 15 54 71 ERR843978.1705 7 45 51 ERR843978.5030 3 46 58 ERR843978.8855 15 48 52 ERR843978.4162 16 48 64 ERR843978.421 14 51 54 ERR843978.4599 12 60 46 ERR843978.5941 18 67 55 ERR843978.3780 15 56 70" | xargs -n4 | awk -v div=3 '{printf "%s", $1; for(i=2;i<=NF;i++) printf " %.3f", $i/div; print ""}'
关键说明:
-v div=3:定义要除以的常量,你可以随时改成需要的数值xargs -n4:把连续的字符串自动分割成每行4个字段%.3f:保留三位小数,和你示例里的格式完全匹配,要是想调整精度,把数字改成2(保留两位)或者4(保留四位)就行
方法2:用Python脚本(灵活可扩展)
如果后续需要添加复杂逻辑,或者对数据做更多处理,Python脚本会更合适:
处理文件中的每行数据
# 定义要除以的常量 DIVISOR = 3 # 读取输入文件(假设每行是一组4个字段的数据) with open("input.txt", "r") as file: for line in file: # 分割每行的字段 fields = line.strip().split() if not fields: continue # 处理第一列之外的字段,除以常量并保留三位小数 processed_fields = [fields[0]] + [str(round(float(field)/DIVISOR, 3)) for field in fields[1:]] # 输出处理后的行 print(" ".join(processed_fields))
直接处理字符串数据
如果你的数据是直接的字符串,也可以这样写:
data = "ERR843978.746 15 54 71 ERR843978.1705 7 45 51 ERR843978.5030 3 46 58 ERR843978.8855 15 48 52 ERR843978.4162 16 48 64 ERR843978.421 14 51 54 ERR843978.4599 12 60 46 ERR843978.5941 18 67 55 ERR843978.3780 15 56 70" DIVISOR = 3 # 分割所有字段,每4个为一组 all_fields = data.split() for i in range(0, len(all_fields), 4): group = all_fields[i:i+4] # 处理数值列 processed = [group[0]] + [str(round(float(num)/DIVISOR, 3)) for num in group[1:]] print(" ".join(processed))
关键说明:
round(float(num)/DIVISOR, 3):确保计算结果保留三位小数,和示例格式一致- 这个脚本很容易扩展,比如可以加异常处理(防止遇到非数值的情况)、修改精度、输出到新文件等
内容的提问来源于stack exchange,提问作者EvenStar69
相关产品推荐
相关产品推荐

