2017-07-07 39 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

到他的代碼,正確的微小的錯字第一行的代碼的末尾(只需額外-'-刪除)。

我很抱歉,我沒有時間去嘗試所有其他建議

與我最好的祝願