2012-11-13 17 views
5

मेरे पास कई हजार कॉलम के साथ एक बड़ी फ़ाइल है। मैं बैश में 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

एडब्ल्यूके के लिए, मुझे वास्तव में यह नहीं मिल सका ... – 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

@ बेबे: सच - मैंने इसे सही कर दिया है। –

+0

यही वह है! धन्यवाद! – Bebe

4

आप स्तंभों की सूची पारित कर सकते हैं इस तरह awk को खोल से हटाए जाएंगे:

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

तो awk programm में यह सरणी में पार्स:

split(kf,kf_array,",") 

और उसके बाद के माध्यम से जाना सभी कॉलम और परीक्षण यदि प्रत्येक विशेष कॉलम kf_array में है और संभवतः इसे

अन्य संभावनाएं आपके ऑनलाइनर सेवर को कॉल करना है अल बार :-)

2

आप awk के बजाय cut का उपयोग कर सकते हैं, तो यह एक 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