2017-07-17 38 views
0

我想相当难写一个脚本,“loopingly”从一个文件中提取子提取子,同时获得该信息所在从另一个文件中删除。我在MobaXterm工作。我有一个文件cut_positions.txt,这是制表符分隔和显示名称,起点,终点,长度,评论:如何使用的子位置信息从一个文件到另一个文件(循环,bash)的

k141_20066 103484 104617 1133 phnW 
k141_20841 13200 14324 1124 phnW 
k141_23852 69 452 383 phnW 
k141_32328 1 180 179 phnW 

,并与名称string_file.txt(这将是没有问题的删除/在其中一个文件)和字符串(原字符串是很长的,达1.000.000字符)添加“>”:

>k141_10671 CCTTCCCCCACACGCCGCTCTTCCGCTCTTGCTGGCC 
>k141_10707 AGGCGGTATCAGACCTTGCCGCAACACTAAGCCCAGTAACGCTGTCGCCCTTATATCTGA 
>k141_11190 CTTTTGTGACAGTGCAGGGCAATGGTGGATTTATCAGTATCGGGCAGAA 
>k141_1479 AGCCGACAGCAGCGCCGAGGGCACATAATCCGATGACACGATGTCCAAAAGATCCGCCTCGGC 

现在我想用从cut_positions.txt输入。我想使用的第一列,以匹配行权,那么第二列的子串的起点和第四列的子串的长度。这应该使用cut_positions.txt中的所有行并写入新的out.txt。为了更接近我尝试过(与我的原始数据):

➤ grep ">k141_28027\b" test_out_one_line.txt | awk '{print substr($2,57251,69)}' 
TCACTTGAGCGCAATTATTCGCTCTCCGGCGGCGTCAGCATCAGCCTGATCATGCGTCACCAAAAGTGT 

其中手工制作的方式很好。我想通了,以及如何访问cut_positions.txt的不同元素(这里的第一行中的第二列):

awk -F '\t' 'NR==1{print $2}' cut_positions.txt 

,但我无法弄清楚如何把它变成一个循环,因为我不知道如何在不同的重定向,管道等步骤连接上,我使用的小步骤。任何帮助是非常赞赏(并告诉我,如果你需要更多的样本数据)

感谢 crazysantaclaus

回答

2

下面的脚本应该为你工作:

cut.awk

# We are reading two files: pos.txt and strings.txt 
# NR is equal to FNR as long as we are reading the 
# first file. 
NR==FNR{ 
    pos[">"$1]=$2 # Store the startpoint in an array pos (indexed by $1) 
    len[">"$1]=$4 # Store the length in an array len (indexed by $1) 
    next # skip the block below for pos.txt 
} 

# This runs on every line of strings.txt 
$1 in pos { 
    # Extract a substring of $2 based on the position and length 
    # stored above 
    key=$1 
    mod=substr($2,pos[key],len[key]) 
    $2=mod 
    print # Print the modified line 
} 

请这样称呼:

awk -f cut.awk pos.txt strings.txt 

其中一个重要事情提及。 substr()假设字符串开始以指数1 - 在相反的地方串在指数0开始大多数编程语言。如果pos.txt的位置是基于0,该substr()必须成为:

mod=substr($2,pos[key]+1,len[key]) 

我建议用简单,有意义的版本进行测试:

pos.txt

foo 2 5 3 phnW 
bar 4 5 1 phnW 
test 1 5 4 phnW 

字符串。TXT

>foo 123456 
>bar 123456 
>non 123456 

输出:

>foo 234 
>bar 4 
+0

非常感谢,但我真的不知道它是如何工作......我只是跑了一个小的子样本,这让我从剩下的琴弦strings.txt?我很抱歉,如果我没有正确使用它,但我需要的是从strings.txt中提取的子字符串。我也应该说,这两个文件在第一列方面不尽相同。我有pos.txt(可能是1000行)从strings.txt(100.000行)中获得匹配的子字符串,因此我的试验中出现了怪异的grep部分。不便之处! – crazysantaclaus

+0

我明白了。更新了答案。 – hek2mgl

+0

嘿hek2mgl,这真的很接近(我猜),但遗憾的是还没有。我担心我在这里使用的术语不对?当我说“但我需要的是从strings.txt中提取的子字符串”我的意思是与你的输出完全相反......所以我对你摆脱的那部分感兴趣......不是那个子?顺便说一句:在输出中显示字符串前的名称是完美的,但如果这使得事情变得复杂(更多的话他们已经是),我想我也可以将它后面的名称与pos.txt合并。 – crazysantaclaus

相关问题