2013-04-29 170 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