Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk和for循环中的cut从文本文件中的行存储变量_Bash_Unix_Awk_Cut - Fatal编程技术网

Bash 使用awk和for循环中的cut从文本文件中的行存储变量

Bash 使用awk和for循环中的cut从文本文件中的行存储变量,bash,unix,awk,cut,Bash,Unix,Awk,Cut,我有一个选项卡分隔的文本文件,称之为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 >

我有一个选项卡分隔的文本文件,称之为
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中ENST0000433768.5和ENST0000431184.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中的范围值为64369676436977。在我的文件Input.log中,我希望得到这份成绩单

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

>ENST00000433768.5|ENSG00000100342.21|OTTHUMG00000030427.9|OTTHUMT00000319253.2|APOL1-209|APOL1|541|protein_coding|
ATCCACACAGCTCAGAACAGCTGGATCTTGCTCAGTCTCTGCCAGGGGAAGATTCCTTGG
AGGAGCACACTGTCTCAACCCCTCTTTTCCTGCTCAAGGAGGAGGCCCTGCAGCGACATG
GAGGGAGCTGCTTTGCTGAGAGTCTCTGTCCTCTGCATCTGGATGAGTGCACTTTTCCTT
GGTGTGGGAGTGAGGGCAGAGGAAGCTGGAGCGAGGGTGCAACAAAACGTTCCAAGTGGG
ACAGATACTGGAGATCCTCAAAGTAAGCCCCTCGGTGACTGGGCTGCTGGCACCATGGAC
CCAGGCCCAGCTGGGTCCAGAGGTGACAGTGGAGAGCCGTGTACCCTGAGACCAGCCTGC
AGAGGACAGAGGCAACATGGAGGTGCCTCAAGGATCAGTGCTGAGGGTCCCGCCCCCATG
CCCCGTCGAAGAACCCCCTCCACTGCCCATCTGAGAGTGCCCAAGACCAGCAGGAGGAAT
CTCCTTTGCATGAGAGCAGTATCTTTATTGAGGATGCCATTAAGTATTTCAAGGAAAAAG
T
在Output.log中,我希望得到这份成绩单

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

>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:这是一个通用解决方案,它将比较两个文件(input和other_file.fa),并在找到的任何一行中的任何一个范围内打印它们。例如-->在300行号上可以找到范围号,但范围显示您应该从1打印到20,在这种情况下也可以。还请注意,这个调用系统命令的命令进一步调用
sed
命令(就像您在
sed
中使用范围),还有其他方法,比如将整个输入文件加载到数组中,然后打印,但我在这里使用这个命令,这不是用大文件测试的

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编辑的样本,请尝试根据其他文件打印以下行。假设您找到的行范围值,这些值将始终位于找到它们的行之后(例如-->找到的第三行范围值,范围为4到10)


注意:这将为您的输入文件的每一行打印成绩单和范围的值,如果您想进一步使用它们的值执行某些操作,请务必提及。

您的评论以其编写方式回答了问题,但我应该更清楚。我在上面做了一些编辑。我最终希望使用范围值搜索第二个文件,并检索范围下限和上限之间的文本行。我的计划是使用sed来实现这一点。我已更改我的循环以包含更多细节。@Ctat41,从1个文件中获取值并与其他值进行比较可以在单个
awk
本身中完成,请使用输入和预期输出的示例更新您的问题,然后我可以编辑我的答案,干杯。我已更新我的问题以包含更多细节,我想从第二个文件中获取每个成绩单之间的文本行。范围内的行是我要提取的。@Ctat41,抱歉,您的问题仍然不完全清楚。如果您可以发布具有预期输出的其他_File.File的示例,那么它将更加清晰,我们可以在单个awk中自己编写,更新您的问题,然后让我知道。@Ctat41,请检查我的EDIT1和EDIT2答案,并让我知道int如何变化。关于
,我需要一个可以逐行迭代的for循环
——无论问题是什么,这都不太可能是解决问题的正确方法。现在还不清楚你到底想做什么(而不是你认为你应该怎么做),到目前为止,这似乎是一个问题。请你的问题清楚地盯着你想做什么。