2012-08-23 154 views
0

我在維基百科編輯歷史上有一個文本分隔文件。每行包含一個不同的維基百科編輯。該文件按頁面標題排序,以便每個頁面的每個編輯都是自己的行(該行由7個不同的變量製表符分隔)。我需要的是每個頁面的第一個和最後一個編輯。我想要的是一個類似的文件,其中每個wikipedia頁面只有一行,每行包含該頁面的第一個和最後一個編輯的所有信息。基本上,一行是文件中第一個和最後一個編輯行的組合。從製表符分隔的文件中提取部分數據

我想知道是否有一個簡單的bash腳本或短的python代碼(我可以在mac osx終端運行的東西),將通過txt文件並輸出我想要的。

謝謝你的幫助!

下面是該文件的前幾行得到的是什麼樣子的想法:

6 233188 AmericanSamoa 2001-01-19T01:12:51Z ip:office.bomis.com ip:office.bomis.com 1516 
6 133180191 AmericanSamoa 2007-05-24T14:41:33Z Ngaiklin 4477979 5 
8 233189 AppliedEthics 2001-01-20T15:01:12Z ip:pD950754B.dip.t-dialin.net ip:pD950754B.dip.t-dialin.net 9 
8 133180238 AppliedEthics 2007-05-24T14:41:48Z Ngaiklin 4477979 6 
10 233192 AccessibleComputing 2001-01-21T02:12:21Z RoseParks 99 8 
10 133180268 AccessibleComputing 2007-05-24T14:41:58Z Ngaiklin 4477979 6 
12 18201 Anarchism 2002-02-25T15:00:22Z ip:Conversion_script ip:Conversion_script 1214 
12 19746 Anarchism 2002-02-25T15:43:11Z ip:140.232.153.45 ip:140.232.153.45 1460 
12 19749 Anarchism 2002-02-27T17:34:09Z ip:24.188.31.147 ip:24.188.31.147 1474 

給出上述行是這樣的輸出的一個例子:(記住,每一頁有不同數量的編輯,範圍從2到幾百,我只需要對每一頁進行第一次和最後一次編輯。我希望輸出類似於下面的例子,其中每一頁都有一行包含第一次和最後一次編輯信息

6 233188 AmericanSamoa 2001-01-19T01:12:51Z ip:office.bomis.com ip:office.bomis.com 1516 2007-05-24T14:41:33Z Ngaiklin 4477979 5 
8 233189 AppliedEthics 2001-01-20T15:01:12Z ip:pD950754B.dip.t-dialin.net ip:pD950754B.dip.t-dialin.net 9 2007-05-24T14:41:48Z Ngaiklin 4477979 6 
10 233192 AccessibleComputing 2001-01-21T02:12:21Z RoseParks 99 8 2007-05-24T14:41:58Z Ngaiklin 4477979 6 
12 18201 Anarchism 2002-02-25T15:00:22Z ip:Conversion_script ip:Conversion_script 1214 2002-02-27T17:34:09Z ip:24.188.31.147 ip:24.188.31.147 1474 
+1

歡迎StackOverflow上的問題。請對您的標籤進行更多選擇。這個問題與維基百科本身無關。這是關於解析製表符分隔的文本。 :-)如果你指出你在詢問什麼操作系統和編程/腳本語言,它也會有所幫助;如果有人提供了bash腳本並且您正在運行Windows,或者如果您使用的是OS X,那麼它將不會很好。您可以編輯您的問題以添加適當的標籤。如果您在問題和標籤中提供詳細信息,它可以幫助您更快地獲得答案。 :-) –

+1

請包括一些示例輸出。很難說出這裏要問什麼。 – Steve

+0

如果您可以確保文件正確排序,即。通過標題和日期,您可以編寫一個PHP/Perl/Python腳本,其中包含讀取,保存標題和輸出標題更改代碼。我認爲這比在bash中做事容易得多。如果你的文件沒有被排序,你可以使用散列圖實現相同的功能。去一趟,發佈一些代碼進行審查,而不是讓人們爲你寫這個東西。 – Pete855217

回答

1

您的示例輸出有點不一致,因爲第一行的文章名稱是兩次。假設你並不真正需要的是,並假設該文件是正確排序,下面的命令適用於我對你的例子:

sed -r ':r;$!{N;br};s/\n/#/g;s/(^|#)((\S+\s+){2})(\S+\s+)([^#]*).*#(\S+\s+){2}\4/\1\2\4\5/g;s/#/\n/g' history.txt 

另一個假設是,你的文件不包含任何#字符,否則您需要將#更改爲文件中未遇到的其他內容。

我猜你需要一些解釋,但首先我想確保它能夠滿足你的需求。請評論有關結果:)

P.S.它一次處理整個文件,可能對你來說太慢了。

+0

這真是令人印象深刻的一點sed正則表達式那裏列弗!在我的* nix框上運行良好,但是當我在Mac上運行它時會重複每行,併爲整個正則表達式提供「未使用的標籤」消息。即使我將-r標誌(* nix)更改爲-E以在Mac上爲sed獲取擴展正則表達式,也會發生這種情況。 – Pete855217

+0

@Pete感謝您的反饋!我在修改POSIX命令時遇到了一些麻煩,任何幫助都是值得讚賞的。 –

+0

@Pete這個可以在Mac上使用嗎? 'sed':r; $!{N; br}; s/\ n /#/ g; s/\(^ \ |#\)\(\([[:alnum:]] \ {1,\} [[:空白:]] \ {1,\} \)\ {2 \} \)\([[:alnum:]] \ {1,\} [[:空白:]] \ {1,\} \)\([^#] * \)*#\([[:alnum:]] \ {1,\} [[:空白:]] \ {1,\} \)\ {2 \} \ 4/\ 1 \ 2 \ 4 \ 5/g; s /#/ \ n/g'history.txt' –

0

我會分兩步做。

  • 比方說,你的數據已經被組織成一個字符串列表(例如,file.readlines()),該列表是data。我們開始建立一個以第一列爲關鍵字的字典,其值是一個2列表的列表,第一列是你的第一個列表,第二列是你最後一個列表。

    results = {} 
    for line in data.split("\n"): 
        fields = line.strip().split("\t") 
        tag = fields[0] 
        if tag: 
         tag = int(tag) 
         if tag in results: 
          # last entry: skip the first three fields 
          results[tag][1] = fields[3:] 
         else: 
          # first entry: skip the first field 
          results[tag] = [fields[1:], []] 
    
  • 現在,我們有我們的字典,這只是分類整理,結合兩個列表和漂亮的印刷結果

    ordered_results = [] 
    for k in sorted(results.keys()): 
        current = results[k] 
        ordered_results.append(current[0]+current[1]) 
    print "\n".join("\t".join(row) for row in ordered_results) 
    
相關問題