在bash脚本中运行awk

时间:2013-04-29 16:23:44

标签: bash unix awk

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

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