首页 > 解决方案 > 如果所有列中的值相同,则删除行

问题描述

我有一个以空格分隔的大文件,其中包含数千行和列。我想删除除第一列之外的所有列中具有相同值的所有行。

输入:

CHROM   108 139 159 265 350 351
SNP1    -1  -1  -1  -1  -1  -1
SNP2    2   2   2   2   2   2
SNP3    0   0   0   -1  -1  -1
SNP4    1   1   1   1   1   1
SNP5    0   0   0   0   0   0

期望的

CHROM   108 139 159 265 350 351
SNP3    0   0   0   -1  -1  -1

Panda 框架有一个类似的问题(删除 pandas 中所有列中具有相同值的重复行),我找到了一个部分解决方案,它删除了仅包含零的行

awk 'NR > 1{s=0; for (i=3;i<=NF;i++) s+=$i; if (s!=0)print}' input > outfile

但我想一次性对数字 -1、0、1 和 2 执行此操作,并将标题和第一列作为标识符。

任何帮助将不胜感激。

标签: awkduplicates

解决方案


我相信你可以做这样的事情:

awk '{s=$0; gsub(FS $2,FS)} (NF > 1) {print s}' file

哪个输出:

CHROM   108 139 159 265 350 351
SNP3    0   0   0   -1  -1  -1

这是如何运作的?

  1. {s=$0; gsub(FS $2,FS)}:这个动作包含 2 个部分:

    • 将当前行存储在变量中s
    • 用字段分隔符替换当前行$0中第二个字段的所有值,包括其起始字段分隔符FS( FS $2) FS。这具有重新定义的副作用,$0并且所有字段变量和字段总数NF都被重新定义。需要字段分隔符FS以避免匹配xxif$2=x
  2. (NF > 1) {print s}:如果您还有 1 个以上的字段,请打印该行,这意味着您有不同的数字。


推荐阅读