有没有办法在awk
脚本中运行bash
脚本?
我有一个大文件(~40GB),我想根据第三个字段进行拆分。第三个字段可以是chr1
,chr2
... chr22
,chrX
和chrY
(共24种类型)。我跑的时候
awk 'BEGIN{OFS=FS="\t"}$3=="chr1"{print $0}' inputfile.txt > inputfile_chr1.txt
它运行正常,但是当我尝试循环时它不会:
for i in {1..22} X Y; do
awk 'BEGIN{OFS=FS="\t"}$3=="chr${i}"{print $0}' inputfile.txt > inputfile_chr${i}.txt
done
我尝试使用$3
的单引号和反斜杠来转义$3
,但一切都失败了。有更好的方法吗?
答案 0 :(得分:3)
您不想使用当前的bash
方法。您正在阅读40GB inputfile.txt
24次!只需使用awk
解析文件一次:
awk '{file="inputfile_"$3".txt";print >> file;close(file)}' inputfile.txt
<强>演示:强>
$ ls
inputfile.txt
$ cat inputfile.txt
1 foo chr1
2 bar chr1
3 abc chr2
4 zyz chr3
5 123 chr2
$ awk '{file="inputfile_"$3".txt";print >> file;close(file)}' inputfile.txt
$ ls
inputfile_chr1.txt inputfile_chr2.txt inputfile_chr3.txt inputfile.txt
$ cat inputfile_chr1.txt
1 foo chr1
2 bar chr1
$ cat inputfile_chr2.txt
3 abc chr2
5 123 chr2
$ cat inputfile_chr3.txt
4 zyz chr3
答案 1 :(得分:1)
看起来你只需要挖出i
。
'BEGIN{OFS=FS="\t"}$3=="chr'${i}'"{print $0}'
答案 2 :(得分:0)
或者,在我看来更好,将i传递给var:
for i in {1..22} X Y; do
awk -v i=$i 'BEGIN{OFS=FS="\t"}$3=="chr" i {print $0}' inputfile.txt > inputfile_chr${i}.txt
done