如何在sed中组合三个连续的文本文件行?

Ada*_*ski 14 sed

我有一个文件,包含三行的重复序列,我想合并在一起.换句话说,我想把除了第三个以外的每一个都替换\n成空间.我想要变换输入

 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'"
Run Code Online (Sandbox Code Playgroud)

 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'"
Run Code Online (Sandbox Code Playgroud)

不幸的是文件很长,所以我不想将整个文件加载到内存中而不是将结果写回文件 - 只需将连接的行打印到标准输出中,这样我就可以进一步管理它.

我知道,潜在 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
Run Code Online (Sandbox Code Playgroud)

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

real    0m1.360s
user    0m1.264s
sys    0m0.236s
Run Code Online (Sandbox Code Playgroud)

有趣的是:为什么sed需要更多的内核时间awk

out.txt长200MB,处理器是Linux-Mint 14上的Intel(R)Core(TM)i7-3610QM CPU @ 2.30GHz,内核为3.8.13-030813-generic.


我需要这个来解析recently-used.xbelCinnamon中最近打开的文件列表

如果你来这里遇到这个具体问题,这一行应该可以帮助你:

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 
Run Code Online (Sandbox Code Playgroud)

Ken*_*ent 19

这个怎么样:

 sed 'N;N;s/\n/ /g' file
Run Code Online (Sandbox Code Playgroud)


Car*_*rum 11

您可以awk非常轻松地使用它:

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

基本的想法是"打印一个空格所包含的每一行,除非它是每三行,在这种情况下打印一个换行符".

  • @Jaypal保持打高尔夫,怎么样:'awk'NR%3 {printf"%s",$ 0; next} 1'档案 (6认同)
  • +1较短版本:`awk'{printf“%s”,$ 0}!(NR%3){print“”}'inputFile` (2认同)