我有 3 个文件:list_file
、file1
和file2
。我想从成对中提取整行file1
并file2
基于list_file
成对提取整行,并将结果连接到输出中。
也就是说,我只需要从 file1 中提取行,并且第 4 列file2
的名称与(分别)的第一列和第二列的名称匹配,然后按照列表文件中显示的相同配对顺序连接输出中的整行。list_file
第 1 列中的名称list_file
出现在 中file1
,第 2 列中的名称list_file
出现在 中file2
。
列表文件:
uth1.g20066 uth2.g18511
uth1.g3149 uth2.g22348
uth1.g20067 uth2.g18512
uth1.g20068 uth2.g18514
uth1.g3154 uth2.g22355
文件1
ut1A 11256 13613 uth1.g20065
ut1A 25598 47989 uth1.g20066
ut1A 39912 40142 uth1.g3148
ut1A 40324 40617 uth1.g3149
ut1A 40699 41034 uth1.g3150
文件2
ut1B 16951 39342 uth2.g18511
ut1B 31265 31495 uth2.g22347
ut1B 31677 31970 uth2.g22348
ut1B 32052 32387 uth2.g22349
ut1B 41596 46862 uth2.g18522
期望的输出:
ut1A 25598 47989 uth1.g20066 ut1B 16951 39342 uth2.g18511
ut1A 40324 40617 uth1.g3149 ut1B 31677 31970 uth2.g22348
为了执行这个任务,我尝试了下面的 python 代码并且它可以工作,但是它很笨拙(很多循环)并且在大输入文件上非常慢,所以让它更简洁会很棒。使用全新的脚本作为替代方案也很有趣,也许使用 awk。谢谢。
data = open("list_file.txt")
data1 = open("file1.txt")
all_lines1 = data1.readlines()
data2 = open("file2.txt")
all_lines2 = data2.readlines()
output = open("output.txt", "w")
for line in data:
columns = line.split( )
geneH1data = columns[0]
geneH2data = columns[1]
for line1 in all_lines1:
columns1 = line1.split( )
chr1 = columns1[0]
start1 = int(columns1[1])
end1 = int(columns1[2])
geneH1data1 = columns1[3]
for line2 in all_lines2:
columns2 = line2.split( )
chr2 = columns2[0]
start2 = int(columns2[1])
end2 = int(columns2[2])
geneH2data2 = columns2[3]
if geneH1data==geneH1data1 and geneH2data==geneH2data2:
output.write(chr1 + " " + str(start1) + " " + str(end1) + " " + geneH1data + " " + chr2 + " " + str(start2) + " " + str(end2) + " " + geneH2data + '\n')
输出.txt
ut1A 25598 47989 uth1.g20066 ut1B 16951 39342 uth2.g18511
ut1A 40324 40617 uth1.g3149 ut1B 31677 31970 uth2.g22348
将 GNU awk 用于
ARGIND
:如果您没有 GNU awk,只需将其调整为:
然后它会在任何 awk 中工作。如果您希望输出以制表符分隔而不是空格分隔,只需再次调整它: