我想從一個巨大的文件(約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的列。
我想從一個巨大的文件(約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的列。
另在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
}'此處的文件'應該被刪除:其他方面完全沒問題! –
這個偉大的awk命令解決了這個問題。在我運行代碼之前:我在第一行添加了#!/ usr/bin/awk -f –
我不知道我在正確理解你的問題,但在這裏的(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
cut -d' ' -f $(head -1 filename|tr ' ' '\n'|awk '{if(!seen[$0]++) print NR}'|paste -s -d ',') filename
這將工作就像一個魅力。
這個問題是由詹姆斯布朗代碼解決的。
我加
到他的代碼,正確的微小的錯字第一行的代碼的末尾(只需額外-'-刪除)。
我很抱歉,我沒有時間去嘗試所有其他建議
與我最好的祝願
顯示你的努力 – RomanPerekhrest
如果它是一個巨大的文件,最簡單的方法是看第一行(例如'sed -n'1p'或'head -n 1',通過眼睛識別壞列(在你的例子1和3中),然後使用'cut'來檢索其他的(例如'cut -d''-f 2,4') – Beta
所以,你要清楚,你是否要刪除重複的列**(所有重複出現的列名),或**刪除具有特定名稱的列**? – randomir