【问题标题】:Sort a list using awk (idiomatically)使用 awk 对列表进行排序(惯用)
【发布时间】:2020-09-21 06:05:00
【问题描述】:

我正在尝试使用 awk 在 Arch mkinitcpio.conf 中安排一些条目。 我想出了一个可行的解决方案,但老实说这让我有点恶心,所以我想知道,一定有更好的方法来实现这样的目标,对吧?

文件中的某处基本上有这样一行:

HOOKS=(base udev autodetect modconf block filesystems keyboard fsck)

我想重新排列它,以便块和键盘在自动检测之前出现。

#! /usr/bin/awk -f
/^\s*HOOKS/ {
    start_list = index ($0, "(" ) + 1
    end_list = index ($0, ")" )
    l = end_list - start_list
    listo = substr($0, start_list, l)
    split(listo, arr, " ")
    j = 1
    for (i in arr)
    {
        if (arr[i] == "keyboard" || arr[i] == "block")
        { }
        else if (arr[i] != "autodetect")
            juck[j++] = arr[i]

        else
        {
            juck[j++] = "keyboard"
            juck[j++] = "block"
            juck[j++] = arr[i]
        }
    }
    for (k in juck)
        print juck[k]
}

根据 cmets 中的请求:期望的结果是这样的一行:

HOOKS=(base udev keyboard block autodetect modconf filesystems fsck)

【问题讨论】:

  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 块、键盘和自动检测是否总是会出现在该列表中?
  • 嗯,不确定。我实际上不知道 Arch 人员保持这些(默认)配置的格式有多稳定。就问题而言,是的。我想更好的方法是只注释掉默认行并逐字输入我想要的行。
  • 如果gsub(/\s*\<(keyboard|autodetect)\>\s*/," "); sub(/\<block\>/,"keyboard block autodetect") 不是您所需要的,那么edit 您的问题可以提供更具代表性的样本输入/输出。
  • 嗯,是的,这基本上就是我正在寻找的那种东西。非常感谢。如果你想把它写成一个简短的答案,我很乐意接受。实际上,我花了大约十五分钟试图弄清楚转义尖括号的用途 - 据我所知,它们是标记单词边界的 bash 功能,显然它们对于脚本的功能并不是绝对必要的,对吗? ?

标签: linux awk sed


【解决方案1】:

这样的东西应该可以工作,也可以扩展更多关键字

$ awk -v order="keyboard block autodetect" '
     BEGIN{n=split(order,o)}
     {gsub("[()]",FS)}
     {if($0 ~ FS o[n] FS)
        {for(i=1;i<n;i++)
          if($0 ~ FS o[i] FS)
           {sub(FS o[i] FS, FS)
            sub(FS o[n] FS, FS o[i] FS o[n] FS)}}}
     {sub("= ","=(")
      sub(/ $/,")")}1' hooks_line

我没有针对其他类型的输入添加防护,但应该使用示例输入并且无论之前的关键字是否存在。

【讨论】:

  • 非常感谢您的意见,我想当我弄清楚您在那里做什么时,我可能会学到一些关于 awk 的有价值的东西。但是这个解决方案,虽然不像我的那样粗糙和愚蠢,但在我看来,它比我的目标更复杂一些,这更像是 Ed Morton 提出的简单的一次性单线器。
猜你喜欢
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2013-04-25
  • 1970-01-01
相关资源
最近更新 更多