2014-03-28 258 views
0

我有一個文件夾模式的這種塊的許多文件多行字符串:查找文件與匹配

115,55 
,175:500 
,123:400 
,[blahblah] 
,[blahblah] 
... 
,[blahblah] 
200,* 
,[blahblah] 
,[blahblah] 
,[blahblah] 
... 

每個塊開始於開始與一些線和開始與多家下一行之前結束。

我需要在同一個塊中查找包含「115,55」和「,123:400」的文件。有可能是任何數量的兩間一樣行:打開始與一些行前

115,55 
,[blahblah] 
... 
,[blahblah] 
,123:400 

摘要::查找文件的名稱以「115,55」旁邊有」 400" 123。

注意:這是一個UDR(使用數據記錄)文件,如果它可能有所幫助。

Python,Perl,sed或awk會有所幫助。

在此先感謝!

+1

你只是要打印的文件名或整個塊或兩者兼而有之?你能提供你的預期產出嗎? –

+0

我只需要打印包含該塊的文件名。 –

回答

3
perl -lne '/^115,55/ ... /^\d/ and /^,123:400/ or next;print $ARGV;close ARGV' *udr 
+0

(/^115,55/../^,123:400 /)=〜/ E /或next'不起作用,因爲它將跨越塊匹配。我相信我已經爲此創建了一個修復程序。但是,perl可以像'* udr'那樣工作嗎?我不知道如何做到這一點,所以可以使用你的建議。 – Miller

+0

@Miller shell的globing和perl只能用'@ ARGV'工作。順便說一句,你的範圍匹配開始和停止在同一行。 –

+0

這就是爲什麼我使用'...'範圍而不是'..'。所以它不會停止並開始在同一條線上。 – Miller

1

使用awk

awk '/115,55/{f=1;next}!/^,/{f=0;next}/,123:400/&&f{print FILENAME;nextfile}' /path/to/files/* 
+1

謝謝,它的工作原理恰到好處! –

+0

哦,我剛剛發現它打印文件的每個命中的文件名。任何方式打破並繼續下一個文件,因爲它發現一個匹配?這會提高性能並縮小輸出。 –

+1

@Yiğitperl解決方案只打印一次文件名。 – Miller