bash - 根据其中一行中的单个字段对行对进行排序

标签 bash shell sed bsd

我正在尝试将流转换为:

#EXTINF:-1 group-title="SERVER 1-Tv" tvg-logo="http://anotherRandomUrl.com/icon.png",NBC
http://AnotherStreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://randomUrl.com/icon.png",ABC HD
http://StreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://YetAnotherRandomUrl.com/icon.png",Discovery
http://DisStreamUrl.m3u8

进入:

#EXTINF:-1 tvg-logo="http://randomUrl.com/icon.png",ABC HD
http://StreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://YetAnotherRandomUrl.com/icon.png",Discovery
http://DisStreamUrl.m3u8
#EXTINF:-1 group-title="SERVER 1-Tv" tvg-logo="http://anotherRandomUrl.com/icon.png",NBC
http://AnotherStreamUrl.m3u8

...通过对以 # 开头的行的第二个逗号分隔字段进行排序,同时将其他行与带有排序键的行一起重新排序。

所以我只会对包含“#EXTINF”的行执行排序,并从“,”之后进行排序。它还应该保留排序行下方的行(URL 行)。

最佳答案

将数据转换为易于排序的格式,然后重新排序。所以:

to_one_line_per_record() {
  local inf_line= line=
  while read -r line; do
    if [[ $line = "#"* ]]; then
      inf_line=$line
    else
      printf '%s\n' "${inf_line},$line"
    fi
  done
}

from_one_line_per_record() {
  local inf_f1 inf_f2 url
  while IFS=, read -r inf_f1 inf_f2 url; do
    printf '%s,%s\n%s\n' "$inf_f1" "$inf_f2" "$url"
  done
}

to_one_line_from_record | sort -t, -k2,2 | from_one_line_per_record

根据给定的输入,to_one_line_per_record 的输出为:

#EXTINF:-1 group-title="SERVER 1-Tv" tvg-logo="http://anotherRandomUrl.com/icon.png",NBC,http://AnotherStreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://randomUrl.com/icon.png",ABC HD,http://StreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://YetAnotherRandomUrl.com/icon.png",Discovery,http://DisStreamUrl.m3u8

通过 sort -t, -k2,2 传递该结果,输出变为:

#EXTINF:-1 tvg-logo="http://randomUrl.com/icon.png",ABC HD,http://StreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://YetAnotherRandomUrl.com/icon.png",Discovery,http://DisStreamUrl.m3u8
#EXTINF:-1 group-title="SERVER 1-Tv" tvg-logo="http://anotherRandomUrl.com/icon.png",NBC,http://AnotherStreamUrl.m3u8

并将传递给from_one_line_per_record,它会转换为:

#EXTINF:-1 tvg-logo="http://randomUrl.com/icon.png",ABC HD
http://StreamUrl.m3u8
#EXTINF:-1 tvg-logo="http://YetAnotherRandomUrl.com/icon.png",Discovery
http://DisStreamUrl.m3u8
#EXTINF:-1 group-title="SERVER 1-Tv" tvg-logo="http://anotherRandomUrl.com/icon.png",NBC
http://AnotherStreamUrl.m3u8

关于bash - 根据其中一行中的单个字段对行对进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45844859/

相关文章:

bash - 如何在不使用 if else 或 switch 或 while 循环的情况下使用 bash 获取当年每个月的最后一天?

linux - 如何从Linux中的字符串中提取以用户定义的特殊字符开头和结尾的子字符串?

shell - SED 用单引号和双引号替换内容

linux - 如何使用 sed 将文本替换为 ":"

linux - 在 shell 后台运行进程 2 分钟,然后在 2 分钟之前终止它 BASH

linux - 如何检查用户指定的名称是否引用目录?

bash - 使用 bash 生成随机 IP 问题

linux - 如何在linux中递归计算某些文件的总大小

bash - 如何在unix中比较单个文件中的两列

linux - 如何转义密码中的双引号和感叹号?