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_
。要包含 X
和 Y
,只需将它们包含在循环
中
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
的值,因此您会得到 chr1
、chr2
等
如果将模式用双引号括起来,如 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.txt
和 chunk_names.txt
.
中搜索模式 chr10.txt
您的 'for' 循环将意味着解析您的文件 N 次(其中 N 是列表中 chromosomes/contigs 的数量)。这是一种使用 awk 的不可知方法,它将只解析一次文件:
awk -F '_' '{ print > ".txt" }' chunk_names.txt
我有一个文本文件 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_
。要包含 X
和 Y
,只需将它们包含在循环
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
的值,因此您会得到 chr1
、chr2
等
如果将模式用双引号括起来,如 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.txt
和 chunk_names.txt
.
chr10.txt
您的 'for' 循环将意味着解析您的文件 N 次(其中 N 是列表中 chromosomes/contigs 的数量)。这是一种使用 awk 的不可知方法,它将只解析一次文件:
awk -F '_' '{ print > ".txt" }' chunk_names.txt