我有这个制表符分隔文件.
的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/'为单个变量.如何打破这种识别模式并让脚本工作?
您可以调整此代码:
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.3和file.44.您可以通过搞乱gsub()函数调用来轻松控制生成的文件名.
请注意,这会使数据文件单次传递,这比通过大量文件传递25次要敏感得多.
使用GNU和Mac OS X(BSD)版本进行测试awk.