awk - 如果所有列中的值相同,则删除行
问题描述
我有一个以空格分隔的大文件,其中包含数千行和列。我想删除除第一列之外的所有列中具有相同值的所有行。
输入:
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 执行此操作,并将标题和第一列作为标识符。
任何帮助将不胜感激。
解决方案
我相信你可以做这样的事情:
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
这是如何运作的?
{s=$0; gsub(FS $2,FS)}
:这个动作包含 2 个部分:- 将当前行存储在变量中
s
- 用字段分隔符替换当前行
$0
中第二个字段的所有值,包括其起始字段分隔符FS
(FS $2
)FS
。这具有重新定义的副作用,$0
并且所有字段变量和字段总数NF
都被重新定义。需要字段分隔符FS
以避免匹配xx
if$2=x
- 将当前行存储在变量中
(NF > 1) {print s}
:如果您还有 1 个以上的字段,请打印该行,这意味着您有不同的数字。
推荐阅读
- php - 需要合并具有相同键值对的单个数组元素
- c++ - C++ 使用 Map 中的参数调用函数
- javascript - 同一页面的不同实例的不同唯一令牌
- javascript - 测试一个使用 setTimeout 和 Jest 的函数:为什么这个测试失败了?
- ios - 如何将 TableViewCell 中的数据作为按钮执行?
- ios - 应用程序从一个 Apple 开发者帐户转移到另一个帐户的后果是什么?
- python-3.x - 使用 Python 和 pygerrit2 库从 Power BI Desktop 对 Gerrit 进行 API 调用
- wordpress - 滚动WordPress时的粘性菜单
- cassandra - 如何为多个节点生成 murmur3Partitioner 的令牌?
- reactjs - 无法从“setupTests.ts”中找到模块“酶”