如何在制表符分隔文件的含数字列中插入文本?
给制表符分隔文件的数字列插入文本的解决方案
要处理你这种在制表符分隔文件的数字列(包括整数、小数、科学计数法格式)中插入文本的需求,用awk工具是最便捷的选择——它天生擅长处理结构化的文本文件,尤其是分隔符明确的表格类数据。
通用解决方案脚本
下面的脚本会自动识别所有数字列,并在数字前插入你指定的文本(比如示例里的Numeric: ),处理后保持原文件的制表符分隔格式:
BEGIN { FS="\t" # 设置输入分隔符为制表符 OFS="\t" # 设置输出分隔符为制表符,保证输出格式不变 } { # 遍历每一列 for(i=1; i<=NF; i++) { # 正则匹配数字:涵盖正负整数、小数、科学计数法(e/E格式) if($i ~ /^[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?$/) { # 这里修改插入的文本,比如改成$i = $i " [数字列]"就是在后面加 $i = "Numeric: " $i } } # 输出处理后的整行 print $0 }
怎么运行这个脚本
- 把上面的代码保存成一个文件,比如
process_num_cols.awk - 执行命令处理你的输入文件(假设输入文件叫
input.txt,输出到output.txt):
awk -f process_num_cols.awk input.txt > output.txt
或者你也可以直接用一行命令完成,不用单独存脚本:
awk 'BEGIN { FS="\t"; OFS="\t" } { for(i=1; i<=NF; i++) { if($i ~ /^[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?$/) { $i = "Numeric: " $i } } print $0 }' input.txt > output.txt
自定义修改
- 如果想在数字后面插入文本,把
$i = "Numeric: " $i改成$i = $i " [numeric]"即可 - 如果只需要处理特定列(比如第1、2、5列),可以在判断里加上列号条件:
if( (i==1 || i==2 || i==5) && $i ~ /^[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?$/ )
测试你的示例数据
拿你提供的第一行数据举例:
10 7.98862e-05 10 cellular organisms; Bacteria; Proteobacteria; Betaproteobacteria; Burkholderiales; Burkholderiaceae; Ralstonia; Ralstonia solanacearum 0.000159772 10 0.000207704
处理后会变成:
Numeric: 10 Numeric: 7.98862e-05 Numeric: 10 cellular organisms; Bacteria; Proteobacteria; Betaproteobacteria; Burkholderiales; Burkholderiaceae; Ralstonia; Ralstonia solanacearum Numeric: 0.000159772 Numeric: 10 Numeric: 0.000207704
完全保留了原有的制表符分隔,只给数字列添加了指定文本。
内容的提问来源于stack exchange,提问作者cazzlewazzle89
相关产品推荐
相关产品推荐

