2013-01-19 4 views
9

क्या कुछ इनपुट CSV फ़ाइल के लिए अंतिम चार कॉलम हटाने के लिए बैश का उपयोग करने का कोई तरीका है? अंतिम चार स्तंभों में ऐसे फ़ील्ड हो सकते हैं जो लाइन से लाइन तक लंबाई में भिन्न हो, इसलिए प्रत्येक पंक्ति के अंत से केवल कुछ निश्चित वर्णों को हटाने के लिए पर्याप्त नहीं है।सीएसवी फ़ाइल से पिछले 4 कॉलम हटाने के लिए बैश विधि

उत्तर

12

कट यह कर सकता है यदि सभी लाइनों में फ़ील्ड या अजीब की संख्या समान है यदि आप नहीं करते हैं।

cut -d, -f1-6 # assuming 10 fields 

क्षेत्रों पर पहले 6 क्षेत्रों प्रिंट आउट करेंगे आप --output-सीमांकक उत्पादन seperater उपयोग को नियंत्रित करना चाहते हैं = स्ट्रिंग

awk -F , -v OFS=, '{ for (i=1;i<=NF-4;i++){ printf $i, }; printf "\n"}' 

लूप्स प्रिंट फ़ील्ड की संख्या -4 और th अप करने के लिए उन्हें बाहर।

+0

अजीब रेखा में, मुझे लगता है कि आप $ print प्रिंट करना चाहते हैं, मैं $ i प्रिंट नहीं करता हूं, है ना? टाइपो शायद? और '$ प्रिंट करें, 'काम नहीं करेगा, आप एक और टाइपो चाहते हैं? – Kent

+0

@ कंट हाँ का मतलब printf $ i है, आपको इसकी आवश्यकता नहीं है; अगर केवल एक कमांड। – peteches

+0

आप सही हैं, लेकिन आपके पास "अल्पविराम" है .. :) – Kent

6

यदि आप कॉलम की संख्या जानते हैं तो आप cut का उपयोग कर सकते हैं।

cut -d',' -f -5 

बहरहाल, यह अपनी csv फ़ाइल किसी भी अल्पविराम नहीं करता है में डेटा मान लिया गया है: उदाहरण के लिए, यदि आपकी फ़ाइल 9 स्तंभ होते हैं, और अल्पविराम अपने सीमांकक है। cut उद्धरण के अंदर अल्पविरामों के रूप में अल्पविरामों की व्याख्या करेगा।

1

awk एक लाइनर:

awk -F, '{for(i=0;++i<=NF-5;)printf $i", ";print $(NF-4)}' file.csv 

awk का उपयोग करने पर कटौती का लाभ है, तो आप गिनती करने के लिए आप कैसे कई कॉलम की क्या ज़रूरत है की जरूरत नहीं है, और कितने कॉलम आप रखना चाहते हैं। चूंकि आप जो चाहते हैं वह पिछले 4 कॉलम को हटा रहा है।

kent$ seq 40|xargs -n10|sed 's/ /, /g'   
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20 
21, 22, 23, 24, 25, 26, 27, 28, 29, 30 
31, 32, 33, 34, 35, 36, 37, 38, 39, 40 

kent$ seq 40|xargs -n10|sed 's/ /, /g' |awk -F, '{for(i=0;++i<=NF-5;)printf $i", ";print $(NF-4)}' 
1, 2, 3, 4, 5, 6 
11, 12, 13, 14, 15, 16 
21, 22, 23, 24, 25, 26 
31, 32, 33, 34, 35, 36 
1

यह आप के लिए काम कर सकते हैं (जीएनयू sed):

परीक्षण को देखने के

sed -r 's/(,[^,]*){4}$//' file 
+0

के मूल्य में विस्तारित किया गया है, मेरी समझ में, यह सबसे अच्छा जवाब है! –

10
cat data.csv | rev | cut -d, -f-5 | rev 

rev लाइनों उलट जाता है, तो यह कोई फर्क नहीं पड़ता अगर सभी पंक्तियों कॉलम की एक ही संख्या है, यह हमेशा अंतिम 4 को हटा देगा। यह केवल तभी काम करता है जब अंतिम 4 कॉलम में कोई कॉमा न हो।

+2

यह मेरी राय में वास्तव में एक अच्छा समाधान है, रेव के उपयोग के लिए +1 (मुझे यह पता नहीं था) – skd

1

एक हैक्ड रास्ता

awk -F, 'OFS=","{for(i=NF; i>=NF-4; --i) {$i=""}}{gsub(",,,,,","",$0);print $0}' temp.txt 
3
awk -F, '{NF-=4; OFS=","; print}' file.csv 

या वैकल्पिक रूप से

awk -F, -vOFS=, '{NF-=4;print}' file.csv 

प्रत्येक पंक्ति से पिछले 4 कॉलम छोड़ देंगे यह awk समाधान।

+0

अतिरिक्त कॉलम ड्रॉप करने का अच्छा तरीका है, लेकिन मेरे लिए यह आउटपुट में रिक्त स्थान के साथ कॉलम के बीच कॉमा को प्रतिस्थापित करता है । क्या इससे बचने और उन्हें अल्पविराम के रूप में रखने का कोई आसान तरीका है? –

+0

आप अपने delimiter वापस awk -F, '{NF- = 4; ओएफएस = ","; प्रिंट} ' –

+0

ग्रेट, यह मेरे लिए काम करता है। ''BEGIN' ब्लॉक में या '-v' कमांड-लाइन तर्क'' awk -F, -vOFS =, ... 'के साथ 'OFS' सेट भी कर सकता है –

संबंधित मुद्दे