适配OpenWRT的`sort -k x -u`替代方案:移除指定列重复项
在OpenWRT Busybox中实现指定列无重复去重(无需排序)
Busybox自带的sort不支持-k参数,没法用常规的sort -k x -u按指定列去重,这里用Busybox内置的awk就能解决,而且不会改变原数据流的顺序:
核心命令
假设要去重的目标是第x列,执行以下命令即可:
awk -v col=x '!seen[$col]++'
示例演示
比如你需要处理第二列(x=2),输入流如下:
1 a 2 a 1 b 2 b
执行命令:
awk -v col=2 '!seen[$col]++'
输出结果:
1 a 1 b
命令逻辑
seen是awk的内置数组,用来记录指定列已经出现过的值!seen[$col]++:当该列值第一次出现时,seen[$col]初始为0,取反后为真,打印当前行;同时seen[$col]自增为1。后续再遇到相同列值时,seen[$col]不为0,取反后为假,直接跳过该行。
自定义分隔符
如果你的数据列分隔符不是空格(比如逗号),可以用-F指定分隔符:
awk -F, -v col=3 '!seen[$col]++'
内容的提问来源于stack exchange,提问作者Piotr Siupa
相关产品推荐
相关产品推荐

