我有一个文件,它由三行的重复序列组成,我想将它们合并在一起。换句话说,我想将除了\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'"
进入
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'"
不幸的是文件很长,所以我不想将整个文件加载到内存中而不是将结果写回文件 - 只需将连接的行打印到标准输出中,这样我就可以进一步管理它。 / p>
我知道可能 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
,最近在Cinnamon中打开的文件列表
如果你来这里遇到这个具体问题,这一行可以帮到你:
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
答案 0 :(得分:13)
怎么样:
sed 'N;N;s/\n/ /g' file
答案 1 :(得分:11)
您可以使用awk
轻松完成此操作:
awk '{ printf "%s", $0; if (NR % 3 == 0) print ""; else printf " " }' file
基本思想是“打印一个空格所包含的每一行,除非它是每三行,在这种情况下打印换行符。”