如何用bash/awk实现多文件合并后移除重复的Lig列(仅保留首个文件的Lig列)
解决重复Lig列的问题
我明白你的需求——合并多个CSV后,只保留第一个文件的Lig列,把后续所有文件的重复Lig列内容清空。你的当前table_fuse函数有个小问题:paste的输出直接追加到文件后,column命令其实没有处理到任何内容(因为输出已经被写入文件了),我们需要调整流程,同时加入awk来处理重复列。
修改后的函数代码
table_fuse () { paste -d' ' "${rescore}"/*.csv | awk -F' ' ' BEGIN {OFS=" "} # 确保输出分隔符也是制表符 { # 从第4列开始,每3列清空一次(对应后续每个文件的Lig列) for (i=4; i<=NF; i+=3) { $i = "" } print $0 }' | column -t -s$' ' >> "${rescore}"/results_2PROTS_CNE_strategy3.csv }
代码解释
paste合并文件:还是用你原来的逻辑,把所有CSV文件按制表符横向合并。awk处理重复列:- 指定制表符为输入/输出分隔符,保证格式一致。
- 循环从第4列开始(对应第二个文件的Lig列),每3列执行一次清空操作(因为你的每个输入CSV都是3列:Lig + 两个dG列),这样就能精准定位后续所有文件的Lig列并清空内容。
column格式化对齐:处理后的内容再用column做格式化,让输出的表格更整齐。- 写入目标文件:最后把处理后的结果追加到目标CSV中。
处理后的效果
用你给出的两个文件例子,执行后会得到如下结果:
Lig dG(10V1) dG(rmsd) dG(10V2) dG(rmsd) lig1 -6.78 0.32 -7.04 0.20 lig2 -5.56 0.14 -5.79 0.45 lig3 -7.30 0.78 -7.28 0.71 lig4 -7.98 0.44 -7.87 0.42 lig5 -6.78 0.28 -6.75 0.31 lig6 -6.24 0.24 -6.24 0.24 lig7 -7.44 0.40 -7.42 0.39 lig8 -4.62 0.41 -5.19 0.11 lig9 -7.26 0.16 -7.30 0.13
如果你的CSV文件列数有变化,只需要调整awk循环里的步长(比如每个文件是4列,就把i+=3改成i+=4)即可。
内容的提问来源于stack exchange,提问作者user14748664
相关产品推荐
相关产品推荐

