2012-06-18 120 views
-3

我盡了最大的努力去理解a very similar StackOverflow question,但是我不能爲我的生活做出建議的gawksplit解決方案在我的情況下工作。將文本文件分解爲多個文本文件

我有一個大的文本文件,由288個提案組成,每個提案的長度爲300到500個字,段落數量不等(因此沒有一致的行數)。然而,每個提案都由以下性質的標識符指示:--###----####--。沒有結束標記 - 儘管我想我可以通過執行一些正則表達式搜索來插入一個,並在將原始文件分解爲多個文件之前替換原始文件。我想要的是288個單獨文本文件的集合,每個文本文件都由兩個破折號之間的數字命名。如果它讓事情變得更容易,我可以輕鬆地將這些文件分爲由三位數字和四位數字組成的提案。

概括地說,我想這樣做:

#! /bin/env bash or python 

Split all_proposals.txt into 121.txt, 122.txt, etc. 

Where all_proposals.txt consists of: 

    --121-- 

    One Line Title of Proposal 

    Followed by several paragraphs each on a line of variable length. 

    Another paragraph for effect. 

    --122-- 

    More lines indeterminate in number. 
+6

看起來你的問題是,「你能爲我寫這段代碼嗎?」,這不是Stack Overflow的意思。你嘗試過一些沒有用的東西嗎? –

+0

'/ bin/env'不是標準位置。你想要'/ usr/bin/env'。 –

+0

@NedBatchelder:以前的嘗試包括但不限於:'csplit abstracts.txt'/ - [0-9] [0-9] [0-9] - /''{186}'',' csplit -f abs abstracts.txt'/ - [0-9] [0-9] [0-9] - /''{186}'','awk'/ - \ d/{f = 1 ; C++} {print>「session。」i}'abstracts.txt'和'gawk -vRS ='\ n - \ [0-9] {3} - \ n'-vprefix =「file」' {print> prefix「ab-」NR「.tx t」}'abstracts_no_id.txt' ...所以,是的,我嘗試了各種不起作用的東西。 –

回答

0

您可以使用Perl :

#!/usr/bin/perl 
open(FI,"file.txt"); 
read(FI,$_,10000000); 
close(FI); 
@arr = split('--###--'); 
$cnt=0; 
for $c (@arr) 
{ 
    open(FO,">$cnt.txt"); 
    print FO $c; 
    close(FO); 
    $cnt++; 
} 
+0

perl的'split'是否認爲「#」字符是正則表達式替換文件中的數字? – jdi

+0

我用' - [0-9] [0-9] [0-9] - '替換了' - ### - ',它工作正常:我有一個包含較小文本的目錄。有兩件事需要補充:首先,它們沒有標題名稱,這不是一個交易斷路器,其次,Perl仍然超越了我的親屬。 –

+0

@ user14664130 - 我希望儘管問題已關閉,但讓我離答案最近的複選標記仍然值得您。 (對不起,很少有人覺得它有用。) –

1

只需設置輸出文件的每個你看到的標題行時間的名稱:

awk '/--[0-9]*--/ {split($0, a, "--"); output=a[2]".txt" } 
    { print > output }' all_proposals.txt 

注意,這個打印標題行放入文件中。如果您不想要,請在標題的操作順序中添加next命令。

+0

這是我見過的awk最神奇的一點。就像我自己以前的嘗試'awk'輸出是原始文件的副本,但只是簡單地用第一個標題重新命名。我覺得有一些重要的信息是我錯過了會讓問題對某個人顯而易見的。 –

0

你可以在幾行內使用regular expressions來解決這個問題。看看文檔;

這個然後的想法,就是要尋找你的標識符,在這種情況下可能是一個表達式像

r'(--[0-9]*--)' 

特別是,看看re.split

+0

我對regex模塊有一個嘗試性的把握,而且之前遇到過're.split',所以我可以看到我可以將該文件讀爲一個大字符串,然後使用正則表達式分割它。我還不擅長的是理解如何通過編寫每個新的小字符串來分離文件來演示腳本。 –