2017-03-02 63 views
-1

我有一個巨大的文件,每個記錄都以空行分隔。我只需要提取那些包含特定字符串的記錄。如何使用sed,awk,perl來解決這個問題?輸入的從一個巨大的文件中提取記錄,使用文本模式,使用sed,awk或perl

實施例:

firstrecord 
data 
moredata 

secondrecord 
data 
moredata2 

... 

我需要提取含有moredata2所有記錄,所以輸出將是

secondrecord 
data 
moredata2 

Perl代碼我已試過,但提取每個記錄到一個新的文件,

我該如何一次提取所有記錄,以及如何從文件中讀取模式?

perl -00ne 's#PAT.*/(.*)\n##; open($F,">","$1.txt"); s/\n\s*(\n|$)//g; 
     print $F "$_\n"' original.txt 
+3

那麼你是如何親自嘗試一下?你是怎麼失敗的?請發表你自己的研究成果 – Inian

回答

-1

awk做魔術在這種情況下

awk -v RS= '/moredata2/{print (f?"\n":"")$0; f=1}' original.txt 

你,

 
secondrecord 
data 
moredata2 

... 
+0

你會如何改變這一點,以便能夠從txt文件中讀取moredata2類似的值,並在每次找到新模式時將其輸出到單獨的文件中? – Stelap

+0

'while read -r p; do awk -v RS = -v pattern =「$ p」'$ 0〜pattern {print(f?「\ n」:「」)$ 0; f = 1}'input_file.txt>「$ p.output」;完成這樣的事情 –

1

請檢查這個代碼可能對您有幫助。你可以嘗試儘可能簡化。

use strict; 
use warnings; 

my $joinline = do { local $/; <DATA> }; 
while($joinline=~m/\n{2}((?:(?!moredata2).)*)moredata2\n/gs) 
{ 
    print "Matched: $&\n"; 
} 


__DATA__ 
firstrecord 
data 
moredata 

secondrecord 
data 
moredata2 

thirdrecord 
data 
moredata 

fourthrecord 
data 
moredata2 

謝謝。

+0

什麼,所以......你正在設置記錄分隔符,但然後迭代整個文件連接它?然後正則匹配?這是一種非常醜陋的方式來編寫'我的$ joinline = do {local $ /; };' – Sobrique

+0

好的謝謝。更新。 – ssr1012

+0

這就是爲什麼在我的答案'你可以嘗試儘可能簡化.' – ssr1012

0

一種awk

awk '/moredata2/' RS="" yourfile 

說明

另一種技術是有空白行獨立的記錄。通過特殊分配,作爲RS的值的空字符串表示 記錄由一個或多個空行分隔。 當RS設置爲 爲空字符串時,每個記錄始終在遇到的第一個空行 處結束。下一條記錄直到之後的第一個非空行 行纔會啓動。無論連續出現多少個空行,它們都作爲一個記錄分隔符。 (空行,必須完全 空;只包含空格不計行)

檢查docs

3

我的答案是 - 使用Perl,設置$/和正則表達式匹配所需的記錄。

$/是記錄分隔符。將它設置爲一個空字符串設置爲'段落'模式,從而迭代查找空白行。這正是你需要的。

m/moredata2/隱式匹配當前塊。

#!/usr/bin/env perl 

use strict; 
use warnings; 

local $/ = ''; 

while (<DATA>) { 
    if (m/moredata2/) { 
     print "Matched:\n"; 
     print; 
    } 
} 

__DATA__ 
firstrecord 
data 
moredata 

secondrecord 
data 
moredata2 
+0

你將如何從外部文件讀取數據?以及如何從外部文件再次讀取moredata2和更多模式? – Stelap

+0

這不是你問的問題。但是從文件中讀取與「open」一樣簡單,然後在while循環中使用該文件句柄而不是「DATA」。從另一個文件讀取模式......也是一個「打開」的問題,讀取它並編譯一個適當匹配的正則表達式。 – Sobrique

相關問題