You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Linux终端中提取TSV文件各列唯一值的单行命令

解决方法:Linux单行命令处理TSV生成列名与唯一值列表

这里有个可以直接在Linux终端执行的单行awk命令,刚好能满足你的需求——处理100列左右的TSV文件,输出无表头的两列TSV,第一列是原列名,第二列是对应列的去重值(逗号分隔):

awk -F'\t' 'NR==1{for(i=1;i<=NF;i++)col[i]=$i; next} {for(i=1;i<=NF;i++)vals[i][$i]=1} END{for(i=1;i<=NF;i++){printf "%s\t", col[i]; sep=""; for(v in vals[i]){printf "%s%s", sep, v; sep=","}; print ""}}' input.tsv

命令拆解说明

我来给你拆解开每个部分,方便理解:

  • -F'\t':告诉awk用制表符作为字段分隔符,完美适配TSV格式
  • NR==1{...; next}:专门处理第一行的表头,把每个列名存进col数组,然后跳过表头行的后续处理
  • {for(i=1;i<=NF;i++)vals[i][$i]=1}:遍历每一行的每一列,用二维数组vals[列索引][列值]来记录唯一值——因为数组的键是唯一的,自动帮我们完成去重
  • END{...}:所有行处理完后执行收尾逻辑,遍历每个列:先输出列名,再遍历该列的所有唯一值,用逗号连接后输出

示例验证

用你给出的测试输入:

main_pos	first_pos	second_pos
e1	green	round
e2	green	square

运行命令后,输出结果完全符合预期:

main_pos	e1,e2
first_pos	green
second_pos	round,square

小提示

如果你的列值里包含逗号,这个命令会让结果出现歧义,但如果你的业务数据里没有这种场景,就完全没问题;另外awk处理100列的TSV效率很高,不用担心性能问题。

内容的提问来源于stack exchange,提问作者Jeffin Rockey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 12:37:31