Grep表示文本文件中的特定数字,并按数字文本文件输出

我有一个文本文件chunk_names.txt,如下所示:

chr1_12334_64321
chr1_134435_77474   
chr10_463252_74754
chr10_54265_423435 
chr13_5464565_547644567

这是一个示例,但所有染色体均被表示(1 ... 22,X和Y)。所有条目均采用相同的格式chr{1..22,X or Y}_*string of numbers*__*string of numbers*

我想将它们分成每个染色体文件,例如将所有从chr10开始的块放入一个名为chr10.txt的文件中:

在Linux中,我尝试过:

for i in {1..22}
do 
    grep chr$i chunk_names.txt > chr$i.txt 
done 

但是,chr1.txt输出文件现在包含其中所有带有1(1、10、11、12等)的所有染色体块。

我将如何修改此脚本以分离出染色体?

我还没有解决如何在同一脚本中包含X或Y染色体的问题,目前正在单独运行

我尝试过的事情:

grep -o gives me just "chr$i" as an output 
grep 'chr$i' gives me blank files
grep "chr$i" has the initial problem 

非常感谢您的宝贵时间。

loveqinjun 回答:Grep表示文本文件中的特定数字,并按数字文本文件输出

“ for”循环意味着将文件解析N次(其中N是列表中的染色体/重叠群数)。这是使用的不可知方法,该方法只会解析一次文件:

awk -F '_' '{ print > $1 ".txt" }' chunk_names.txt
,

如果在数字后面加上_,则可以区分chr1_和例如chr10_。要包含XY,只需在循环中包含它们

for i in {1..22} X Y
do 
    grep "chr${i}_" chunk_names.txt > chr$i.txt 
done 

要仅在行首进行搜索,您可以在模式中添加前导^

    grep "^chr${i}_" chunk_names.txt > chr$i.txt 

有关您的尝试的说明:

grep chr$i在行中的任何位置搜索模式。 Shell将变量$i的值替换为i,因此您得到chr1chr2等。

如果您将模式用双引号括为grep "chr$i",则Shell不会对字符串进行任何文件名加粗或分割操作,但仍会扩展变量。就您而言,它与不带引号的情况相同。

如果使用单引号,则外壳程序将按原样使用文字字符串,因此,您始终搜索包含chr$i(而不是chr1等)的行,该行不会出现在文件中

有关报价的说明:

在您的情况下,我提议的解决方案中的引号不是必需的,但是将所有内容都引为好习惯。如果您的模式将包含Shell专用的空格或字符,则引号会有所不同。

示例:

如果文件包含chr1*而不是chr1_,则模式chr${i}*将被匹配文件列表取代。

在创建输出文件chr1.txt等后,请尝试以下命令

$ i=1; echo chr$i*
chr10.txt chr11.txt chr12.txt chr13.txt chr14.txt chr15.txt chr16.txt chr17.txt chr18.txt chr19.txt chr1.txt
$ i=1; echo "chr$i*"
chr1*

在第一种情况下,grep命令

    grep chr${i}* chunk_names.txt

将扩展为

    grep chr10.txt chr11.txt chr12.txt chr13.txt chr14.txt chr15.txt chr16.txt chr17.txt chr18.txt chr19.txt chr1.txt chunk_names.txt

它将在文件chr10.txt ... chr11.txtchr1.txt中搜索模式chunk_names.txt

本文链接:https://www.f2er.com/3103848.html

大家都在问