BASH:如何对固定格式文件的关联列排序并去除重复数据?
解决固定格式文件按元素名去重并保留首条记录的问题
针对你这个固定格式文件的去重需求——只保留每个元素(如SI、H)的第一条记录,同时保留原子ID,这里有个非常高效的awk方案,完美适配固定宽度的字段处理:
核心命令
awk '{ # 提取第二列(第6到第10个字符,对应固定格式的第二个5char字段) elem = substr($0, 6, 5) # 去除元素名前后的空格(因为固定格式会补空格占满5位) gsub(/^[[:space:]]+|[[:space:]]+$/, "", elem) } # 只打印每个元素的第一条记录 !seen[elem]++' your_input_file.txt
命令解释
- 提取固定字段:
substr($0,6,5)精准截取第二列的5个字符(因为第一列是前5位,所以从第6位开始取5个)。 - 清理元素名:
gsub命令去掉元素名前后的空格,把类似"SI "的格式转换成纯净的"SI"。 - 去重逻辑:
!seen[elem]++是awk经典的去重技巧——用数组seen记录已经处理过的元素名,第一次遇到某个元素时,seen[elem]为0,!0为真,就打印当前行;之后再遇到该元素时,seen[elem]会变成1及以上,条件不成立,就跳过打印。
效果验证
用你提供的示例输入测试,这个命令会输出:
1SI SI 1 0.411 3.644 1.684 14164H H14164 0.322 1.045 10.580
完全符合你期望的结果,既保留了每个元素的第一条记录,又不会打乱原文件的行顺序。
内容的提问来源于stack exchange,提问作者Leon WANG
相关产品推荐
相关产品推荐

