使用awk计算15个同结构文件对应位置最大值(忽略缺失值)
用AWK轻松计算多文件对应位置的最大值(忽略缺失值)
嘿,这个需求用AWK处理再合适不过了——它天生擅长文本行列的批量操作,完全能搞定你说的15个文件对应位置取最大值、忽略?缺失值的需求,甚至还能处理全缺失的情况输出.。下面是具体的实现方案:
核心脚本实现
把这段代码存成compute_max.awk文件:
BEGIN { # 定义缺失值和全缺失时的输出符号,方便后续修改 missing = "?" all_missing = "." } # 先处理第一个文件,初始化各列的最大值数组 FNR == NR { for (i=1; i<=NF; i++) { max_val[i] = ($i != missing) ? $i : missing } next } # 处理剩下的所有文件,逐个列更新最大值 { for (i=1; i<=NF; i++) { if ($i != missing) { # 如果当前列之前是缺失值,或者当前值更大,就更新最大值 if (max_val[i] == missing || $i > max_val[i]) { max_val[i] = $i } } # 当前值是缺失值的话,啥也不做,保留之前的最大值 } } # 所有文件处理完,输出最终结果 END { for (i=1; i<=length(max_val); i++) { printf "%s ", (max_val[i] == missing) ? all_missing : max_val[i] } print "" }
执行命令
在终端里跑这条命令就行,它会自动遍历ifile1.txt到ifile15.txt,把结果输出到ofile.txt:
awk -f compute_max.awk ifile{1..15}.txt > ofile.txt
脚本逻辑说明
- BEGIN块:提前定义好缺失值标记
?和全缺失时要输出的.,以后要是缺失值符号变了,改这里就行,不用动后面的逻辑。 - 第一个文件处理:用
FNR == NR这个AWK专属的判断,先把第一个文件的每一列值存到max_val数组里——如果是有效数字就存数字,缺失值就存?。 - 后续文件处理:对每个后续文件的每一行,挨个列对比:如果当前列的数值不是缺失值,就和数组里已有的最大值比,更大的话就更新;如果是缺失值,直接跳过,不影响之前的结果。
- END块:遍历整个
max_val数组,把每个位置的结果打出来——要是某个位置全是缺失值,就输出.,否则输出计算出来的最大值,最后加个换行让格式更整齐。
小提醒
- 确保所有输入文件的行列数完全一致哦,不然可能会出奇怪的结果。
- 要是你的缺失值不是
?,只需要改BEGIN里的missing变量就行,非常灵活。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

