2016-05-21 60 views
0

我想從位於兩行之間的大型文件行中提取,每行由特定模式標記,讓我們說pattern1和pattern2。 我的代碼:通過僅執行第一個模式的精確匹配來提取兩個模式之間的線

awk "/pattern1/{flag=1;next}/pattern2/{flag=0}flag" filename 

驗證是否爲「樣式」的行存在,並開始從該行打印,直到它找到其中字符串「模式2」的存在後續的線。

我想要做的是將字符串「pattern1」與awk將開始打印的行完全匹配,並通過驗證行中是否存在「pattern2」來檢測awk將停止打印的行精確匹配)。所以基本上,我想對第一個模式進行精確匹配,並保持上面的命令對第二個模式的匹配行爲。

回答

0

awk具有內置像這樣的功能:

$ cat data 
abcd 
pattern1 
xyz 
pattern2 
abcde 
$ awk '/pattern1/,/pattern2/' data 
pattern1 
xyz 
pattern2 

而且sed有太:

$ sed -n '/pattern1/,/pattern2/p' data 
pattern1 
xyz 
pattern2 

編輯:爲你將不得不使用某種錨,無論是單詞邊界\ygawk或者像這樣的開始和結束錨點:

$ cat data 
abcd 
pattern1 234 
pattern1 
xyz 
pattern2 
abcde 
$ awk '/^pattern1$/,/pattern2/' data 
pattern1 
xyz 
pattern2 

如果你想打印的組合或不打印pattern1/pattern2線,你可以使用這些:

$ awk '/^pattern1$/{flag=1} /pattern2/{flag=0}flag' data 
pattern1 
xyz 
$ awk '/^pattern1$/{flag=1;next} /pattern2/{flag=0}flag' data 
xyz 
$ awk '/^pattern1$/{flag=1;next;} /pattern2/{flag=0;print}flag' data 
xyz 
pattern2 
+0

如果我們在數據文件的第一行和第二行之間添加「pattern1 234」,那麼'awk'/ pattern1 /,/ pattern2 /'data'將會打印出「pattern1 234」,「pattern1」,「xyz 「和」模式2「。正如我在文章中所說的,我想爲第一種模式做EXACT匹配,併爲第二種模式做默認/經典匹配。我放在我的文章中的命令與您的命令大致相同,只是它不打印包含模式(您的代碼)的行。 – dada

+0

@dada很好,你將不得不向我們展示你的輸入數據和正則表達式模式,以便我們可以完成那些精確匹配。如果你想要全字匹配,你可以使用'gawk',字邊界爲'\ y'或者像這樣放置錨點:'awk'/^pattern1 $ /,/ pattern2/data'這將打印你想要的信息 – ritesht93

0

下面是一行另一個答案與問題的建議:

awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{flag=0;next} {if (flag == 1) {print}}' 

的第一種模式必須完全匹配整行(使用^和$),而第二種模式可以出現在行中的任何位置。

編輯:此版本確實打印模式1出現的行。如果你不想打印它們,用「flag = 1; next」替換「flag = 1; print; next」。

0
awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{if (flag == 1) {print}; flag=0;} {if (flag == 1) {print}}' filename 

這樣就可以避免打印雙「模式2」:

me:~$ awk 'BEGIN{flag=0} /^pattern1$/{flag=1;print;next} /pattern2/{if (flag == 1) {print}; flag=0;} {if (flag == 1) {print}}' a 
pattern1 
xyz 
as pattern2 sd 

me:~$ cat a 
abcd 
pattern1 23 
pattern1 
xyz 
as pattern2 sd 
abcde 
pattern2 
+0

你是什麼談論?你還沒有在這裏發佈任何答案... –

+0

我已經發布了我的答案時間,在你做之前...你怎麼能告訴我我的回答不考慮你的回答時,當我發佈它時不存在? –

+1

我已經改變了它......因爲你肯定是對的!這是一種傲慢的言論。 –

0

無採樣輸入/輸出這是一個猜測,但是這可能是你想要什麼:

awk '/pattern2/{flag=0} flag; $0=="pattern1"{flag=1}' filename 

可能寫得更有意義:

awk '/end_regexp/{found=0} found; $0=="start_string"{found=1}' filename 

(Nbd,但是命名一個標誌flag與命名一個功能function一樣有用!)

其實,我覺得這可能是你真的應該使用什麼,但IDK的:

awk 'index($0,"end_string"){found=0} found; $0=="start_string"{found=1}' filename 

https://stackoverflow.com/a/18409469/1745001見更多的方式使用awk來查找文本。

相關問題