2013-04-29 168 views
2

有没有办法来bash脚本中运行一个脚本awk内? 我有一个大文件(〜40GB),我想根据第三个字段进行拆分。第三字段可以是chr1chr2 ... chr22chrXchrY(总共24种)。当我运行awk的运行bash脚本

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但一切都失败了。有一个更好的方法吗?

回答

3

您不想使用您当前的bash方法。您正在阅读24次的40GB inputfile.txt!只需简单地用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

你是最棒的!谢谢,它非常棒! – arnstrm 2013-04-29 16:45:14

1

看起来像你只需要挖掘出i

'BEGIN{OFS=FS="\t"}$3=="chr'${i}'"{print $0}' 
+0

虽然这可能是一个快速修复它真的不是OP想要的修复。目前的方法是读取40GB的输入文件22次。更不用说,这不是shell变量值应该传递给awk的方式。 – 2013-04-29 16:36:59

+0

@djechlin:非常感谢!所以如果我理解正确:如果使用2个单引号,它会扩展变量,但如果我使用1它不会,对不对? – arnstrm 2013-04-29 16:37:29

+0

@sudo_O:你能否提出一个更好的方法?我非常感谢任何帮助。谢谢。 – arnstrm 2013-04-29 16:39:40

0

或者说,在我看来比较好,通过我的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