首页 > 解决方案 > bash/awk:合并多个文件后删除重复的列

问题描述

我正在使用在我的 bash 脚本中编写的以下函数,以便将许多文件(包含多列数据)合并到一个包含所有融合数据的大摘要图表中

table_fuse () {   
    paste -d'\t' "${rescore}"/*.csv >> "${rescore}"/results_2PROTS_CNE_strategy3.csv | column -t -s$'\t'
}

以两个文件为例,此例程将生成以下连接图表作为合并的结果:

# file 1.                   # file 2
Lig dG(10V1) dG(rmsd)   Lig dG(10V2) dG(rmsd)
lig1 -6.78 0.32 lig1 -7.04 0.20
lig2 -5.56 0.14 lig2 -5.79 0.45
lig3 -7.30 0.78 lig3 -7.28 0.71
lig4 -7.98 0.44 lig4 -7.87 0.42
lig5 -6.78 0.28 lig5 -6.75 0.31
lig6 -6.24 0.24 lig6 -6.24 0.24
lig7 -7.44 0.40 lig7 -7.42 0.39
lig8 -4.62 0.41 lig8 -5.19 0.11
lig9 -7.26 0.16 lig9 -7.30 0.13

由于这两个文件共享相同的第一列(Lig),如何在每个 fused 文件中删除(替换为“”)该列的所有重复,同时仅保留第一个 CSV 中的 Lig 列?

标签: bashawkmultiple-columns

解决方案


编辑:根据 OP 的评论,[Ll]ig在文件中添加以下解决方案[Ll]ig0123[Ll]ig(abcd)

awk '{first=$1;gsub(/[Ll]ig([0-9]+)?(\([-azA-Z]+\))?/,"");print first,$0}'  Input_file


考虑awk到您只想在lig(digits)此处删除重复值,您可以尝试以下操作。

awk '{first=$1;gsub(/[Ll]ig([0-9]+)?/,"");print first,$0}' Input_file

说明:为上述添加详细说明。

awk '                   ##Starting awk program from here.
{
  first=$1              ##Setting first column value to first here.
  gsub(/[Ll]ig([0-9]+)?/,"")  ##Globally substituting L/lig digits(optional) with NULL in whole line.
  print first,$0        ##printing first and current line here.
}
' Input_file            ##mentioning Input_file name here.

推荐阅读