2016-04-11 227 views
0

我想在許多塊中均勻分割文件。這是我的代碼:用分隔符awk將文件分解爲多個文件awk

awk '/*/ { delim++ } { file = sprintf("splits/audio%s.txt", int(delim /2)); print >> file; }' < input_file 

我的文件看起來是這樣的:

"*/audio1.lab" 
0 6200000 a 
6200000 7600000 b 
7600000 8200000 c 
. 
"*/audio2.lab" 
0 6300000 a 
6300000 8300000 w 
8300000 8600000 e 
8600000 10600000 d 
. 

這是給我一個錯誤:AWK:第1行:語法錯誤或接近* 我不知道有足夠的瞭解awk理解這個錯誤。我試圖逃避角色,但仍然無法弄清楚。我可以在python中編寫腳本,但我想了解如何在awk中執行此操作。任何人都知道我做錯了什麼?

編輯:我有14021個文件。我以前兩個爲例。

+0

目前尚不清楚你到底想要做什麼。你想分裂文件或合併文件或其他東西?那個魔杖是輸入一個文件還是兩個單獨的文件?澄清'我試圖在多個塊中均勻分割文件'。意思是在給定樣本輸入的情況下發布期望的輸出。 –

+0

按標題拆分文件。方便的標題是「*」 – badner

+0

唯一的行所以你有1個文件看起來像你的發佈的輸入,你想分裂成多個文件,每塊一個?或者你是否試圖從輸入文件中獲取2個塊到每個輸出文件(因此除以2)或其他東西?這與你有14021個文件有什麼關係?你想爲所有輸入文件中的每個塊輸入獨特的輸出文件還是某種合併或什麼?再次,更好的描述和張貼預期的輸出將是一個很大的幫助。 –

回答

1

首先,你的正則表達式是非法的; '*'表示匹配前一個字符0次或更多次,但沒有以前的字符。

這並不完全清楚你想要做什麼,但它看起來像當你遇到一個星號的行,你想衝擊文件編號。要匹配一個星號,你需要逃避它:

awk '/\*/ { close(file); delim++ } { file = sprintf("splits/audio%d.txt", int(delim /2)); print >> file; }' < input_file 

還要注意%d是從int小數輸出正確的格式字符。

+0

你是正確的大衛。當我找到一個星號時,我試圖碰撞。我也嘗試了你的建議,但它給了我一個不同的錯誤:awk:無法打開「splits/audio1021.txt」輸出(太多打開文件)我有更多的文件比兩個,我試圖保持簡單的問題。這是一個記憶問題嗎? – badner

+0

這是很多文件。在你的第一個條款中,嘗試如下所示:{close(file); delim ++} –

+0

完美!你先生是個巫師!我不知道關閉。這真是好東西。 – badner

1

IDK的什麼都解決此問題,其他的東西是約但只拆分輸入文件到單獨的輸出文件中的所有你需要的是:

awk '/\*/{close(out); out="splits/audio"++c".txt"} {print > out}' file 

這樣以來*?+可以「重複」元字符當它們是正則表達式中的第一個字符時,它們具有字面含義,正則表達式/*/在某些(例如gawk)中可以正常工作,但不是所有的awks,並且由於顯然存在打開太多文件的問題,因此您一定不能使用gawk(爲您管理文件),因此您可能需要轉義*close()每個輸出文件在完成寫入之後。這樣做沒有什麼壞處,它使腳本可以移植到所有的awks中。

+1

更清潔。我考慮重寫,但指出什麼是破壞似乎更具啓發性。 –

+0

還有一個邊緣案例(常見的乾淨代碼),其中第一個*之前的任何內容都會丟失。爲了解決這個問題,'out'應該在'BEGIN'部分初始化。 –

+0

OP在第一個'*'之前沒有任何行,所以我們不需要處理這個潛在的情況。如果該陳述是錯誤的,那麼OP需要修正他的樣本輸入/輸出,以便我們可以看到我們真正處理的是什麼。 –