删除unix中的重复列

时间:2017-07-07 15:34:00

标签: unix sed cut

我想从一个巨大的文件中删除多个重复列(大约一百万)。 我要删除的列具有相同的列名:A和其他列具有不同的唯一名称。说:

A B2 A B3

1.1 AA 1.2 AA

2.1 AB 4.3 CT

2.2 AC 6.4 GT

所以列标题是A,B2,A,B3,.... 如何从数据中删除名为A&#39的列。

4 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了您的问题,但这里有一个(GNU)awk解决方案来删除所有重复的列(仅保留第一次出现):

#!/usr/bin/awk -f

NR==1 {
    seen[$1] = 1
    cols[0] = 1
    for (i=2; i<=NF; i++) {
        if (!($i in seen)) {
            seen[$i] = 1
            cols[length(cols)] = i
        }
    }
}

{
    for (i=0; i<length(cols); i++)
        printf $(cols[i]) " "
    printf "\n"
}

对于第一行(NR==1),我们找到所有非重复列(保留顺序),对于所有其他行,我们只打印出之前选择的列(字段)({{ 1}}数组保存我们希望保留的列/字段索引。

cols

答案 1 :(得分:0)

awk中的另一个人:

$ awk '
NR==1 {
    split($0,a)
    for(i in a)
        if(a[i]=="A")
            delete a[i]
}
{
    for(i=1;i<=NF;i++)
        printf "%s",(i in a?$i OFS:"")
    printf ORS
}' file
B2 B3 
AA AA 
AB CT 
AC GT 

答案 2 :(得分:0)

cut -d' ' -f $(head -1 filename|tr ' ' '\n'|awk '{if(!seen[$0]++) print NR}'|paste -s -d ',') filename

这将像魅力一样工作。

答案 3 :(得分:-1)

问题由詹姆斯布朗代码解决。

我添加了

!/ usr / bin / awk -f

到他的代码的第一行,并在代码末尾修正微小的拼写错误(只是附加 - ' - 删除)。

对不起,我没有时间尝试所有其他建议

抱着我的祝福