如何对制表符分隔的多列文本文件各列单独去重并输出唯一值
多列单独去重合并解决方案
实现思路
你的思路完全可行,实现逻辑如下:
- 先获取输入文件的总列数
- 为每一列创建临时文件,提取该列所有非空值后去重,保留表头
- 用
paste命令将所有列的去重结果按制表符拼接,自动补全空行对齐
完整脚本
#!/bin/bash # 检查输入参数 if [ $# -ne 1 ]; then echo "用法: $0 <输入制表符分隔文件>" exit 1 fi input_file="$1" # 创建临时目录 tmp_dir=$(mktemp -d) # 获取总列数 total_col=$(head -n 1 "$input_file" | awk -F'\t' '{print NF}') # 逐列处理 for ((i=1; i<=total_col; i++)); do # 提取列,保留表头,内容按首次出现顺序去重 awk -F'\t' -v col="$i" ' NR == 1 {print $col; next} $col != "" {print $col} ' "$input_file" | awk '!seen[$0]++' > "${tmp_dir}/col_${i}.txt" done # 合并所有列,制表符分隔 paste -d'\t' "${tmp_dir}"/col_*.txt # 清理临时文件 rm -rf "$tmp_dir"
使用方法
- 将上述脚本保存为
col_dedup.sh - 赋予执行权限:
chmod +x col_dedup.sh - 执行脚本输出结果:
./col_dedup.sh your_input_file.tsv > output_file.tsv
说明
- 自动适配任意列数的制表符分隔文件
- 每列单独去重,保留值第一次出现的顺序,和示例输出逻辑一致
- 空值会自动忽略,最终输出按最长列自动对齐,不足的位置留空
- 输出默认采用制表符分隔,和输入格式保持一致
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

