【发布时间】:2020-06-21 03:16:39
【问题描述】:
我有两个 1708 行和不同列数的制表符分隔文件。我的目标是比较为所有行存储的值,但只有一些特定列。我有两个列表,其中包含要比较的列号;这里是一个例子:
- FileA ➝ col_ind_A = [12,20,24,55]
- FileB ➝ col_ind_B = [14,28,35,79]
在这里,文件 A 的第 12 列应该与文件 B 的第 14 列进行比较,文件 A 的第 20 列与文件 B 的第 28 列进行比较,依此类推。如果文件 A 的值为 0 而文件 B 没有,我想在该位置修改文件 C(文件 A 的副本),然后存储文件 B 的值(不是 0):
# FileA #FileB #FileC
col11 col12 col13 col13 col14 col15 col11 col12 col13
A C G A C G A C G
G 0 T G T T G T T
我已经看到比较列通常使用 awk 完成,但我对 bash 很陌生,我不知道如何在迭代时迭代两个文件的行在 col_ind 列表上并指示我要比较的列位置。欢迎提出任何建议。
如果有任何帮助,我会展示一个 R 代码,它正是这样做的(它太慢了):
for(i in 1:1708){ #rows
for(j in 1:31946){ #cols
if( fileA[i, col_ind_A[j]] == '0' && fileA[i, col_ind_A[j]] != fileB[ i, col_ind_B[j]]){
fileC[i, col_ind_A[j]] <- fileB[i, col_ind_B[j]] # write value from fileB in file C
}
}
}
任何帮助都会很棒。谢谢!!
【问题讨论】:
-
您能否分享您输入文件的示例记录。
-
我会将文件转换为 SQLite 或其他数据库。索引相关列的速度,并要求数据库引擎处理查询。最终将最终输出重新格式化为数据文件。
-
@Armali 你是对的,我刚刚解决了这个问题,谢谢。至于我的记录样本,它们是使用 PLINK 创建的 .ped 文件,它们看起来与示例中的完全相同,但行和列更多。我希望这会有所帮助。