我想使用bash对我的enigma2 dreambox中的频道列表进行排序。该文件如下所示:
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/1/new.aviM
#DESCRIPTION new 5[EN]
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/11/all2.mkvM
#DESCRIPTION all 2 [EN]
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/movie3.mp4M
#DESCRIPTION movie 3 [EN]
正如您在文件中看到的,每个通道由两行组成。我想在bash中每次对两行进行排序。
结果应该如下所示:
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/11/all2.mkvM
#DESCRIPTION all 2 [EN]
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/movie3.mp4M
#DESCRIPTION movie 3 [EN]
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/1/new.aviM
#DESCRIPTION new 5[EN]
第一个是上面有SERVICE
的all 2 [EN]
。
第二个是上面有SERVICE
的电影movie 3 [EN]
。
第三个是上面有SERVICE
的电影new 5[EN]
。
我现在使用一个循环,这是非常慢的。我认为使用bash可以更快地完成这项工作。
可能的解决方案可能是,例如:
#DESCRIPTION新的服务器4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/1/new.aviM #DESCRIPTION 5EN#SERVICE 2 EN#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/11/all2.mkvM #DESCRIPTION 5EN#SERVICE 3 EN#SERVICE 4097:0:1:0:0:0:0:0:0:0:0:0:0:0:0:0:http%3A//server.com/movie/movie3.mp4M
发布于 2017-08-23 05:24:30
awk
和 sed
#!/usr/bin/env bash
awk '/^#SERV/ {s=$0} /^#DESC/ {print s "\t" $0}' |
sort -t $'\t' -k 2,2 |
sed 's/\t/\n/'
发布于 2017-08-23 04:56:50
在接下来的解决方案中,我将在连接的行间使用\r。在纯Unix文本文件中,你不会有那些愚蠢的窗口东西,它可以用sed
或tr
代替。如何以相反的顺序连接两行?使用rev
rev inputfile |
awk '{printf("%s%s",$0,(NR%2==0) ? "\n" : "\r")}' |
rev | sort | tr '\r' '\n'
当您使用sort
密钥时,可以避免颠倒文件。我使用CTRL-V CRTL-M输入^M。我不信任你的文件名后面的字母M
,也许你更喜欢像#
这样的东西
awk '{printf("%s%s",$0,(NR%2==0) ? "\n" : "\r")}' file |
sort -t'^M' -k2,1 | tr '\r' '\n'
发布于 2017-08-23 05:00:52
awk解决方案:
awk '/#SERVICE/ && getline nl > 0{ print nl"|"$0 | "sort -k2,2 -k3,3" }' file
| awk -F'|' '{ print $2 ORS $1}'
输出:
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/11/all2.mkvM
#DESCRIPTION all 2 [EN]
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/movie3.mp4M
#DESCRIPTION movie 3 [EN]
#SERVICE 4097:0:1:0:0:0:0:0:0:0:http%3A//server.com/movie/1/new.aviM
#DESCRIPTION new 5[EN]
其他sed方法:
sed '/#DESCRIPTION/N;{s/\n/|/}' <(tac file) | sort -k2,2 -k3,3 | sed -E 's/(.*)\|(.*)/\2\n\1/'
https://stackoverflow.com/questions/45825880
复制相似问题