2013-06-03 55 views
6

我有一個文件,它由三行重複序列組成,我想合併在一起。換句話說,我想把第三個\n都換成空間。例如。我想變換輸入如何在sed中連接三行連續的文本文件?

href="file:///home/adam/MyDocs/some_file.pdf" 
visited="2013-06-02T20:40:06Z" 
exec="'firefox %u'" 
href="file:///home/adam/Desktop/FreeRDP-WebConnect-1.0.0.167-Setup.exe" 
visited="2013-06-03T08:50:37Z" 
exec="'firefox %u'" 
href="file:///home/adam/Friends/contact.txt" 
visited="2013-06-03T16:01:16Z" 
exec="'gedit %u'" 
href="file:///home/adam/Pictures/Screenshot%20from%202013-06-03%2019:10:36.png" 
visited="2013-06-03T17:10:36Z" 
exec="'eog %u'" 

href="file:///home/adam/MyDocs/some_file.pdf" visited="2013-06-02T20:40:06Z" exec="'firefox %u'" 
href="file:///home/adam/Desktop/FreeRDP-WebConnect-1.0.0.167-Setup.exe" visited="2013-06-03T08:50:37Z" exec="'firefox %u'" 
href="file:///home/adam/Friends/contact.txt" visited="2013-06-03T16:01:16Z" exec="'gedit %u'" 
href="file:///home/adam/Pictures/Screenshot%20from%202013-06-03%2019:10:36.png" visited="2013-06-03T17:10:36Z" exec="'eog %u'" 

不幸的是,文件是相當長的,所以我不希望整個文件加載到內存中,而不是寫導致迴文件 - 只需將連接的行輸出到標準輸出中,這樣我就可以進一步管理它。

我知道潛在sed可能只是爲它工作,但在我給了它一個誠實的嘗試後,我仍然在一個平方;學習曲線對我來說太陡了。 :-(


我做了一個粗略的標杆,我發現,該sed變種幾乎快一倍

time awk '{ printf "%s", $0; if (NR % 3 == 0) print ""; else printf " " }' out.txt >/dev/null 

real 0m1.893s 
user 0m1.860s 
sys  0m0.028s 

time cat out.txt | sed 'N;N;s/\n/ /g' > /dev/null 

real 0m1.360s 
user 0m1.264s 
sys 0m0.236s 

有趣的是:爲什麼sed是否需要更多的內核時間比awk

out.txt長度爲200MB,處理器爲Linux-Mint 14上的Intel(R)Core(TM)i7-3610QM CPU @ 2.30GHz,內核爲3.8.13-030813-generic。


我需要這在我的努力來解析recently-used.xbel,在肉桂

如果你來到這裏,爲這個特定問題的最近打開的文件列表,此行應該可以幫助您:

xpath -q -e "//bookmark[*]/@href | //bookmark[*]/@visited | //bookmark[*]/info/metadata/bookmark:applications[1]/bookmark:application[1]/@exec" recently-used.xbel | sed 's/href="\(.*\)"/"\1"/;N;s/visited="\(.*\)"/\1/;N;s/exec="\(.*\)"/"\1"/;s/\n/ /g' | xargs -n3 whatever-script-you-write 

回答

7

這個怎麼樣:

sed 'N;N;s/\n/ /g' file 
7

您可以使用awk要做到這一點很容易地:

awk '{ printf "%s", $0; if (NR % 3 == 0) print ""; else printf " " }' file 

的基本思路是「打印用空格folowed每一行,除非它的每一個三線,在這種情況下打印換行」。

+1

+1較短的版本:'awk'{printf「%s」,$ 0}!(NR%3){print「」}'inputFile' –

+0

是的,我有。但我不知道額外的空間是否重要,所以我謹慎小心。 –

+4

@Jaypal繼續打高爾夫球,怎麼樣:'awk'NR%3 {printf「%s」,$ 0; next} 1'文件' – Kent

相關問題