2012-11-13 69 views
5

我有一個包含數千列的大文件。我想用Bash中的AWK一次刪除一些特定的列和字段分隔符。如何在AWK中一次刪除多個列和字段分隔符?

我可以一次刪除一列與此oneliner(第3列將被刪除,其對應的字段分隔符):

awk -vkf=3 -vFS="\t" -vOFS="\t" '{for(i=kf; i<NF;i++){ $i=$(i+1);}; NF--; print}' < Big_File 

不過,我想一次刪除多個列...可有人幫我弄清楚這一點?

+0

不,不是這樣的。在這裏你選擇特定的列,而不是間隔內的列... – Bebe

+0

我不同意。在上述兩個問題中,都會出現刪除範圍和列表的答案。 – Thor

+0

AWK,我真的找不到它...... – Bebe

回答

2

這裏是卡米爾的想法的實現:

awk -v remove="3,8,5" ' 
    BEGIN { 
    OFS=FS="\t" 
    split(remove,a,",") 
    for (i in a) b[a[i]]=1 
    }               
    { 
    j=1 
    for (i=1;i<=NF;++i) { 
     if (!(i in b)) { 
     $j=$i 
     ++j 
     } 
    } 
    NF=j-1 
    print 
    } 
' 
+0

然而,謝謝你,腳本改變字段分隔符,我想繼續使用「標籤」作爲分隔符,任何想法? – Bebe

+0

@Bebe:真的 - 我已經糾正它。 –

+0

就是這樣!謝謝! – Bebe

4

您可以通過列的列表,從外殼被刪除awk這樣的:

awk -vkf="3,5,11" ... 

然後在awk PROGRAMM解析成數組:

split(kf,kf_array,",") 

,然後我們將向您所有的colums並測試每個特定列是否在kf_array中,並且可能跳過它

其他可能性是打電話給你的oneliner服務器人的時間:-)

2

如果您可以使用cut代替awk,這一個是cut簡單:

例如由此得出的列1,3和50從文件:

cut -f1,3,50- file

0

像這樣的東西應該工作:

awk -F'\t' -v remove='3|8|5' ' 
{ 
    rec=ofs="" 
    for (i=1;i<=NF;i++) { 
     if (i !~ "^(" remove ")$") { 
     rec = rec ofs $i 
     ofs = FS 
     } 
    } 
    print rec 
} 
' file 
相關問題