寻求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
相关产品推荐
相关产品推荐

