gpt4 book ai didi

bash - 使用 awk 将行中的变量存储在文本文件中并切入 for 循环

转载 作者:行者123 更新时间:2023-12-04 03:30:23 25 4
gpt4 key购买 nike

我有一个制表符分隔的文本文件,将其命名为 input.txt

cat input.txt
Begin Annotation Diff End Begin,End
6436687 >ENST00000422706.5|ENSG00000100342.21|OTTHUMG00000030427.9|-|APOL1-205|APOL1|2901|protein_coding| 50 6436736 6436687,6436736
6436737 >ENST00000426053.5|ENSG00000100342.21|OTTHUMG00000030427.9|-|APOL1-206|APOL1|2808|protein_coding| 48 6436784 6436737,6436784
6436785 >ENST00000319136.8|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000075315.5|APOL1-201|APOL1|3000|protein_coding| 51 6436835 6436785,6436835
6436836 >ENST00000422471.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319151.1|APOL1-204|APOL1|561|nonsense_mediated_decay| 11 6436846 6436836,6436846
6436847 >ENST00000475519.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319153.1|APOL1-212|APOL1|600|retained_intron| 11 6436857 6436847,6436857
6436858 >ENST00000438034.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319152.2|APOL1-210|APOL1|566|protein_coding| 11 6436868 6436858,6436868
6436869 >ENST00000439680.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319252.1|APOL1-211|APOL1|531|nonsense_mediated_decay| 10 6436878 6436869,6436878
6436879 >ENST00000427990.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319154.2|APOL1-207|APOL1|624|protein_coding| 12 6436890 6436879,6436890
6436891 >ENST00000397278.8|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319100.4|APOL1-202|APOL1|2795|protein_coding| 48 6436938 6436891,6436938
6436939 >ENST00000397279.8|ENSG00000100342.21|OTTHUMG00000030427.9|-|APOL1-203|APOL1|1564|protein_coding| 28 6436966 6436939,6436966
6436967 >ENST00000433768.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319253.2|APOL1-209|APOL1|541|protein_coding| 11 6436977 6436967,6436977
6436978 >ENST00000431184.1|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319254.1|APOL1-208|APOL1|550|nonsense_mediated_decay| 11 6436988 6436978,6436988

使用 input.txt 中的信息我想从名为 Other_File.fa 的文件中获取信息。该文件是一个注释文件,其中填充了 ENST#(转录本 ID)和 A、T、C 和 G 的序列。我想将序列存储在名为 Output.log 的文件中(参见下面的示例),我想将用于检索文本的命令存储在名为 Input.log 的文件中(参见下面的示例)。

我已尝试使用 awk 执行此操作,并使用 for 循环进行切割。这是我试过的代码。

for line in `awk -F "\\t" 'NR != 1 {print substr($2,2,17)"@"$5}' input.txt`
do
transcript=`cut -d "@" -f 1 $line`
range=`cut -d "@" -f 2 $line` #Range is the string location in Other_File.fa
echo "Our transcript is ${transcript} and our range is ${range}" >> Input.log
sed -n '${range}' Other_File.fa >> Output.log
done

这是 Other_File.fa 中 ENST00000433768.5 和 ENST00000431184.1 之间的 11 行的示例。

grep -A 11 ENST00000433768.5 Other_File.fa
>ENST00000433768.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319253.2|APOL1-209|APOL1|541|protein_coding|
ATCCACACAGCTCAGAACAGCTGGATCTTGCTCAGTCTCTGCCAGGGGAAGATTCCTTGG
AGGAGCACACTGTCTCAACCCCTCTTTTCCTGCTCAAGGAGGAGGCCCTGCAGCGACATG
GAGGGAGCTGCTTTGCTGAGAGTCTCTGTCCTCTGCATCTGGATGAGTGCACTTTTCCTT
GGTGTGGGAGTGAGGGCAGAGGAAGCTGGAGCGAGGGTGCAACAAAACGTTCCAAGTGGG
ACAGATACTGGAGATCCTCAAAGTAAGCCCCTCGGTGACTGGGCTGCTGGCACCATGGAC
CCAGGCCCAGCTGGGTCCAGAGGTGACAGTGGAGAGCCGTGTACCCTGAGACCAGCCTGC
AGAGGACAGAGGCAACATGGAGGTGCCTCAAGGATCAGTGCTGAGGGTCCCGCCCCCATG
CCCCGTCGAAGAACCCCCTCCACTGCCCATCTGAGAGTGCCCAAGACCAGCAGGAGGAAT
CTCCTTTGCATGAGAGCAGTATCTTTATTGAGGATGCCATTAAGTATTTCAAGGAAAAAG
T
>ENST00000431184.1|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319254.1|APOL1-208|APOL1|550|nonsense_mediated_decay|

此转录本的 input.txt 中的范围值为 6436967,6436977。在我的这份成绩单的 Input.log 文件中,我希望得到

Our transcript is ENST00000433768.5 and our range is 6436967,6436977

在 Output.log 中我希望得到这个成绩单

>ENST00000433768.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319253.2|APOL1-209|APOL1|541|protein_coding|
ATCCACACAGCTCAGAACAGCTGGATCTTGCTCAGTCTCTGCCAGGGGAAGATTCCTTGG
AGGAGCACACTGTCTCAACCCCTCTTTTCCTGCTCAAGGAGGAGGCCCTGCAGCGACATG
GAGGGAGCTGCTTTGCTGAGAGTCTCTGTCCTCTGCATCTGGATGAGTGCACTTTTCCTT
GGTGTGGGAGTGAGGGCAGAGGAAGCTGGAGCGAGGGTGCAACAAAACGTTCCAAGTGGG
ACAGATACTGGAGATCCTCAAAGTAAGCCCCTCGGTGACTGGGCTGCTGGCACCATGGAC
CCAGGCCCAGCTGGGTCCAGAGGTGACAGTGGAGAGCCGTGTACCCTGAGACCAGCCTGC
AGAGGACAGAGGCAACATGGAGGTGCCTCAAGGATCAGTGCTGAGGGTCCCGCCCCCATG
CCCCGTCGAAGAACCCCCTCCACTGCCCATCTGAGAGTGCCCAAGACCAGCAGGAGGAAT
CTCCTTTGCATGAGAGCAGTATCTTTATTGAGGATGCCATTAAGTATTTCAAGGAAAAAG
T

但我收到以下错误,我不确定为什么或如何修复它。

cut: ENST00000433768.5@6436967,6436977: No such file or directory
cut: ENST00000433768.5@6436967,6436977: No such file or directory
Our transcript is and our range is

我的想法是 awk 中的每一行都将被读取为一个字符串,然后 cut 可以沿着我添加的“@”符号拆分该字符串,但它正在将每一行读取为一个文件并在它不能时抛出错误'在我的目录中找到该文件。

谢谢。

最佳答案

EDIT2: 这是一个通用解决方案,它将比较 2 个文件(输入和 other_file.fa),并在找到范围的任何一行上打印它们。例如--> 范围编号在 300 行号上找到,但范围显示您应该打印 1 到 20,在这种情况下它也可以工作。另请注意,此调用系统命令进一步调用 sed 命令(就像您在 sed 中使用范围一样),还有其他方法,例如将整个 Input_file 加载到数组中或所以然后打印,但我在这里使用这个,公平警告这没有用巨大的文件进行测试。

awk -F'[>| ]' '
FNR==NR{
arr[$2]=$NF
next
}
($2 in arr){
split(arr[$2],lineNum,",")
print arr[$2]
start=lineNum[1]
end=lineNum[2]
print "sed -n \047" start","end"p \047 " FILENAME
system("sed -n \047" start","end"p\047 " FILENAME)
start=end=0
}
' file1 FS="[>|]" other_file.fa

编辑: 使用 OP 的编辑示例,请尝试按照以下步骤打印基于其他文件的行。假设您找到范围值的行,这些值将始终在他们找到的行之后(例如-->找到第 3 行范围值,范围是 4 到 10)。

awk -F'[>| ]' '
FNR==NR{
arr[$2]=$NF
next
}
($2 in arr){
split(arr[$2],lineNum," ")
start=lineNum[1]
end=lineNum[2]
}
FNR>=start && FNR<=end{
print
if(FNR==end){
start=end=0
}
}
' file1 FS="[>|]" other_file.fa


您不需要使用 for 循环执行此操作,然后每次为每一行调用 awk 程序。考虑到您只需打印它们,这可以在单个 awk 中完成。使用您展示的示例编写和测试。

awk -F'[>| ]' 'FNR>1{print "Our transcript is:"$3" and our range is:"$NF}' Input_file

注意:这将打印每行您的 Input_file 转录本和范围值,如果您想进一步使用它们的值执行某些操作,请务必提及。

关于bash - 使用 awk 将行中的变量存储在文本文件中并切入 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66988984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com