使用 awk 和/或 sed 按字母顺序对文件中的行进行排序

2024-03-11

我有一个包含数百行的文件,格式如下:

#blah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC]

#xblah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC]

#ablah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC]

我想在 awk/sed 中创建一个脚本,使用每组文本第三行中的第二个参数按字母顺序排列此文件。在此文件中,它是“abc”、“hkf”或“xyz”,可以是任何内容 - 它们是在此 apache 重定向文件中创建的重定向。

我想我想做的是:

  1. 将每组三行连接成一行,每行之间使用分隔符
  2. 使用 sort -k3,3 对行进行排序
  3. 然后用分隔空行重新组装 3 行结构
  4. 写入文件

我的预期输出如下所示:

#ablah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC]

#xblah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC]

#blah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC]

这有道理吗?有一个更好的方法吗?

附注我的目的是使脚本可移植,以便它可以用于此结构的多个文件。当建议解决问题的代码时,请尽可能详细地说明,以便像我这样的新手开始理解如何有效地解决这个问题并能够扩展最终结果。

非常感谢任何和所有的帮助。


您可以在 Gnu Awk 中完成整个操作:

awk -f sort.awk input.txt

where sort.awk is

BEGIN {
    RS=""
}
{
    match($0,/RewriteRule \^\/(.*)\(\|/,a)
    key[NR]=a[1] "\t" NR
    block[NR]=$0
}

END {
    asort(key)
    for (i=1; i<=NR; i++) {
        split(key[i],a,"\t")
        print block[a[2]]
        printf "\n"
    }
}

生产:

#ablah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC]

#xblah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC]

#blah
RewriteCond %{HTTP_HOST} www.blah.com [NC]
RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 awk 和/或 sed 按字母顺序对文件中的行进行排序 的相关文章

随机推荐