首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在bash中,如何使用第二行作为索引,一次对两行进行排序?

在bash中,如何使用第二行作为索引,一次对两行进行排序?
EN

Stack Overflow用户
提问于 2017-08-23 03:49:21
回答 6查看 1.3K关注 0票数 2

我想使用bash对我的enigma2 dreambox中的频道列表进行排序。该文件如下所示:

代码语言:javascript
复制
#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中每次对两行进行排序。

结果应该如下所示:

代码语言:javascript
复制
#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]

第一个是上面有SERVICEall 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

  • Sort

  • 再次创建两行。
EN

回答 6

Stack Overflow用户

发布于 2017-08-23 05:24:30

awk sed

代码语言:javascript
复制
#!/usr/bin/env bash

awk '/^#SERV/ {s=$0} /^#DESC/ {print s "\t" $0}' |
  sort -t $'\t' -k 2,2 |
  sed 's/\t/\n/'
票数 1
EN

Stack Overflow用户

发布于 2017-08-23 04:56:50

在接下来的解决方案中,我将在连接的行间使用\r。在纯Unix文本文件中,你不会有那些愚蠢的窗口东西,它可以用sedtr代替。如何以相反的顺序连接两行?使用rev

代码语言:javascript
复制
rev inputfile |
   awk '{printf("%s%s",$0,(NR%2==0) ? "\n" : "\r")}' |
   rev | sort | tr '\r' '\n' 

当您使用sort密钥时,可以避免颠倒文件。我使用CTRL-V CRTL-M输入^M。我不信任你的文件名后面的字母M,也许你更喜欢像#这样的东西

代码语言:javascript
复制
awk '{printf("%s%s",$0,(NR%2==0) ? "\n" : "\r")}' file |
   sort -t'^M' -k2,1 | tr '\r' '\n'
票数 0
EN

Stack Overflow用户

发布于 2017-08-23 05:00:52

awk解决方案:

代码语言:javascript
复制
awk '/#SERVICE/ && getline nl > 0{ print nl"|"$0 | "sort -k2,2 -k3,3" }' file 
| awk -F'|' '{ print $2 ORS $1}'

输出:

代码语言:javascript
复制
#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方法:

代码语言:javascript
复制
sed '/#DESCRIPTION/N;{s/\n/|/}' <(tac file) | sort -k2,2 -k3,3 | sed -E 's/(.*)\|(.*)/\2\n\1/'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45825880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档