2017-07-07 55 views
-2

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

甲B2甲B3

1.1 AA 1.2 AA

2.1 AB 4.3 CT

2.2 AC 6.4 GT

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

+1

显示你的努力 – RomanPerekhrest

+0

如果它是一个巨大的文件,最简单的方法是看第一行(例如'sed -n'1p'或'head -n 1',通过眼睛识别坏列(在你的例子1和3中),然后使用'cut'来检索其他的(例如'cut -d''-f 2,4') – Beta

+0

所以,你要清楚,你是否要删除重复的列**(所有重复出现的列名),或**删除具有特定名称的列**? – randomir

回答

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 
+0

}'此处的文件'应该被删除:其他方面完全没问题! –

+0

这个伟大的awk命令解决了这个问题。在我运行代码之前:我在第一行添加了#!/ usr/bin/awk -f –

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),我们发现所有非重复列(保留顺序),对于所有其他行,我们只是打印出我们之前选择的列(字段)(cols数组包含我们希望保留的列/字段索引)。

$ ./filter.awk file 
A B2 B3 
1.1 AA AA 
2.1 AB CT 
2.2 AC GT 
0
cut -d' ' -f $(head -1 filename|tr ' ' '\n'|awk '{if(!seen[$0]++) print NR}'|paste -s -d ',') filename 

这将工作就像一个魅力。

-1

这个问题是由詹姆斯布朗代码解决的。

我加

!在/ usr /斌/的awk -f

到他的代码,正确的微小的错字第一行的代码的末尾(只需额外-'-删除)。

我很抱歉,我没有时间去尝试所有其他建议

与我最好的祝愿