2

有没有办法在脚本中运行awk脚本bash?我有一个大文件(~40GB),我想根据第三个字段进行拆分。第三个字段可以是chr1, chr2... chr22, chrXand 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,但一切都失败了。有一个更好的方法吗?

4

3 回答 3

3

您不想使用当前的bash方法。您正在阅读 40GB inputfile.txt24 次!只需简单地解析文件一次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
于 2013-04-29T16:28:13.797 回答
1

看起来你只需要挖出来i

'BEGIN{OFS=FS="\t"}$3=="chr'${i}'"{print $0}'
于 2013-04-29T16:26:12.777 回答
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
于 2013-04-30T15:04:59.730 回答