Grep 获取文本文件中的特定数字并按数字文本文件输出

Grep for specific numbers within a text file and output per number text file

我有一个文本文件 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 

非常感谢您的宝贵时间。

如果您在数字后面加上 _,您可以区分 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 将不会对字符串进行任何文件名匹配或拆分,但仍会扩展变量。在您的情况下,它与没有引号的情况相同。

如果您使用单引号,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

这将在文件 chr11.txt ... chr1.txtchunk_names.txt.

中搜索模式 chr10.txt

您的 'for' 循环将意味着解析您的文件 N 次(其中 N 是列表中 chromosomes/contigs 的数量)。这是一种使用 的不可知方法,它将只解析一次文件:

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