例如,如果我的文件如下所示:
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
),您可以先对文件进行排序。