如何保留模式匹配的最高编号的行?

如何保留模式匹配的最高编号的行?

例如,如果我的文件如下所示:

string
string1
string2
string4
string800
value2
value3
value5
value10
something18
something20   

我想要的输出是

string800 
value10
something20

数字之前的单词可以是任何东西,但是当我说“模式匹配的地方”时,我的意思是我想保留数字之前的单词相同的最高数字,例如,800 高于 10 和 20 ,但当前面的单词不是 800 之前的单词时,我仍然想保留包含 10 和 20 的数字,就像上面的示例一样。

我需要这个在 OSX 上工作,所以请避免只存在于 GNU 实用程序中的功能。

答案1

我没有 osxawk来尝试这个,但它可以在我的 linux gnu awk 上运行:

awk '
{ n = match($0, /[0-9]+ *$/);
  if(n){
    word = substr($0, 1, n - 1); num = 0 + substr($0, n);
    if(!(word in max) || max[word] < num) max[word] = num
  }
}
END{ for(word in max)print word max[word] } '

在每一行上,我们在正则表达式模式的行中查找起始索引,该索引是带有可选尾随空格的数字。我们将该索引处的行拆分为单词部分和数字部分。通过向数字字符串添加 0 将其转换为数字。由单词索引的关联数组保存最大的数字。

答案2

如果与给定前缀相对应的行总是分组的(即所有行都stringNNN在一起等),则可以使用 awk,缓冲具有相同前缀的行,然后打印出具有最高后缀的行。

awk '{
    match($0, /[0-9]*/);
    current_prefix = substr($0, 1, RSTART);
    current_number = substr($0, RSTART, RLENGTH);
    if (current_prefix == previous_prefix) {
        if (current_number > max_number) max_number = current_number;
    } else {
        if (NR != 1) print previous_prefix max_number;
        previous_prefix = current_prefix;
        max_number = current_number;
    }
}
END { if (NR != 1) print previous_prefix max_number; }'

如果与给定前缀对应的行并不总是分组(例如,您可以有foo1 bar1 foo2),您可以先对文件进行排序。

相关内容