2013-06-03 5 views
6

私は一緒に結合したい3行の繰り返しシーケンスからなるファイルを持っています。言い換えれば、私はすべての3番までをスペースに置き換えたいと思います。例えば。私は残念ながら、ファイルがかなり長いので、私はメモリにファイル全体をロードしないことを好むだろうとバックにもたらすために書くことではないsedでテキストファイルの3つの連続する行を結合するには?

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'" 

が欲しいですfile - 連結された行を標準出力に出力するだけで、それをさらにパイプすることができます。

私は、が潜在的にsedであることを知っていますが、正直な試みをした後もまだ正方形です。学習曲線は私にとってはあまりにも急である。 :-(


私はラフなベンチマークを行なったし、私はsedバリアントは、ほぼ2倍高速であること、が分かった

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 

基本的な考え方である「それは改行を印刷した場合には、すべての3行目は、でない限り、スペースでfolowed各ラインを印刷します」。

+1

+1短いバージョン: 'awk '{printf"%s "、$ 0}!(NR%3){print" "}' inputFile' –

+0

ええ、私はそれを持っていました。しかし余分なスペースが重要かどうかは分かりませんでしたので、慎重に誤っていました。 –

+4

@Jaypalはゴルフを続けています: 'awk 'NR%3 {printf"%s "、$ 0; next} 1' file' – Kent

関連する問題