在bash脚本中使用awk提取模式

Tur*_*tle 0 bash shell awk

我有这个制表符分隔文件.

的test.txt

chr1      10111412      apples
chr2      195121230     pears
chr2      991924122     elephants
Run Code Online (Sandbox Code Playgroud)

如果我想从chr2的第1列中找到东西,

awk '/chr2\t/ Test.txt

输出:

chr2      195121230     pears
chr2      991924122     elephants
Run Code Online (Sandbox Code Playgroud)

但是如果我从chr1到chr25有几亿行,并且需要将它们分成特定于chr的文本文件,我想到这样做:

#!/bin/sh
for num in $(seq 1 25)
do
awk '/chr$num\t/' Test.txt > chr$num.txt
done
Run Code Online (Sandbox Code Playgroud)

我也尝试将awk改为sed

sed -n 'chr$num\t/p' Test.txt

两者当然都失败了.我怀疑脚本识别'/chr$num\t/'为单个变量.如何打破这种识别模式并让脚本工作?

Jon*_*ler 5

您可以调整此代码:

awk '$1 ~ /^chr[0-9]+$/ { x = $1; gsub(/chr/, "file.", x); print > x }'
Run Code Online (Sandbox Code Playgroud)

给定输入流:

chr1 d e
chr1 f g
chr44 abc def
chr3 cba fed
Run Code Online (Sandbox Code Playgroud)

它生成3个文件file.1,file.3file.44.您可以通过搞乱gsub()函数调用来轻松控制生成的文件名.

请注意,这会使数据文件单次传递,这比通过大量文件传递25次要敏感得多.

使用GNU和Mac OS X(BSD)版本进行测试awk.