bash/awk: 合并多个文件后删除重复的列
bash/awk: remove duplicate columns after merging of several files
我正在使用我的 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),如何才能删除(替换为“”)每个混淆文件中该列的所有重复项,同时仅保留 Lig 列第一个 CSV?
替换重复的短语并不难。什么对你的情况有效取决于精确的输入文件格式;但是像
sed s/^\([^ ]*\)\( .* \) / /' file
将删除第一列中任何重复的标记。
也许更好的解决方案是使用更复杂的合并工具。一个简单的 Awk 或 Python 脚本可以在合并时负责从除第一个文件之外的每个文件中删除第一个标记。
编辑: 根据 OP 的评论涵盖 [Ll]ig
或 [Ll]ig0123
或 [Ll]ig(abcd)
在此处添加以下解决方案的文件格式。
awk '{first=;gsub(/[Ll]ig([0-9]+)?(\([-azA-Z]+\))?/,"");print first,[=10=]}' Input_file
对于 awk
,考虑到您只想在此处删除 lig(digits)
重复值,您可以尝试执行以下操作。
awk '{first=;gsub(/[Ll]ig([0-9]+)?/,"");print first,[=11=]}' Input_file
解释:为以上添加详细解释。
awk ' ##Starting awk program from here.
{
first= ##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,[=12=] ##printing first and current line here.
}
' Input_file ##mentioning Input_file name here.
join
似乎是一个解决方案,至少对于 OP 提供的样本数据而言是这样...
示例输入数据:
$ cat file1
Lig dG(10V1) dG(rmsd)
lig1 -6.78 0.32
lig2 -5.56 0.14
lig3 -7.30 0.78
lig4 -7.98 0.44
lig5 -6.78 0.28
lig6 -6.24 0.24
lig7 -7.44 0.40
lig8 -4.62 0.41
lig9 -7.26 0.16
$ cat file2
Lig dG(10V2) dG(rmsd)
lig1 -7.04 0.20
lig2 -5.79 0.45
lig3 -7.28 0.71
lig4 -7.87 0.42
lig5 -6.75 0.31
lig6 -6.24 0.24
lig7 -7.42 0.39
lig8 -5.19 0.11
lig9 -7.30 0.13
我们可以 join
第一列(又名字段)上的这两个文件,如下所示:
$ join -j1 file1 file2
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
对于超过 2 个文件,需要某种 repetitive/looping 方法来重复将新文件加入混音。
我正在使用我的 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),如何才能删除(替换为“”)每个混淆文件中该列的所有重复项,同时仅保留 Lig 列第一个 CSV?
替换重复的短语并不难。什么对你的情况有效取决于精确的输入文件格式;但是像
sed s/^\([^ ]*\)\( .* \) / /' file
将删除第一列中任何重复的标记。
也许更好的解决方案是使用更复杂的合并工具。一个简单的 Awk 或 Python 脚本可以在合并时负责从除第一个文件之外的每个文件中删除第一个标记。
编辑: 根据 OP 的评论涵盖 [Ll]ig
或 [Ll]ig0123
或 [Ll]ig(abcd)
在此处添加以下解决方案的文件格式。
awk '{first=;gsub(/[Ll]ig([0-9]+)?(\([-azA-Z]+\))?/,"");print first,[=10=]}' Input_file
对于 awk
,考虑到您只想在此处删除 lig(digits)
重复值,您可以尝试执行以下操作。
awk '{first=;gsub(/[Ll]ig([0-9]+)?/,"");print first,[=11=]}' Input_file
解释:为以上添加详细解释。
awk ' ##Starting awk program from here.
{
first= ##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,[=12=] ##printing first and current line here.
}
' Input_file ##mentioning Input_file name here.
join
似乎是一个解决方案,至少对于 OP 提供的样本数据而言是这样...
示例输入数据:
$ cat file1
Lig dG(10V1) dG(rmsd)
lig1 -6.78 0.32
lig2 -5.56 0.14
lig3 -7.30 0.78
lig4 -7.98 0.44
lig5 -6.78 0.28
lig6 -6.24 0.24
lig7 -7.44 0.40
lig8 -4.62 0.41
lig9 -7.26 0.16
$ cat file2
Lig dG(10V2) dG(rmsd)
lig1 -7.04 0.20
lig2 -5.79 0.45
lig3 -7.28 0.71
lig4 -7.87 0.42
lig5 -6.75 0.31
lig6 -6.24 0.24
lig7 -7.42 0.39
lig8 -5.19 0.11
lig9 -7.30 0.13
我们可以 join
第一列(又名字段)上的这两个文件,如下所示:
$ join -j1 file1 file2
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
对于超过 2 个文件,需要某种 repetitive/looping 方法来重复将新文件加入混音。