किसी फ़ाइल के 5 वें कॉलम मान के आधार पर .CSV फ़ाइल को फ़िल्टर करें और उन रिकॉर्डों को एक नई फ़ाइल में प्रिंट करें


16

मेरे पास एक .CSV फ़ाइल है, जिसके नीचे प्रारूप है:

"column 1","column 2","column 3","column 4","column 5","column 6","column 7","column 8","column 9","column 10
"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23455","12312255564","string, with, multiple, commas","string with or, without commas","string 2","USD","433","70%","07/15/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""
"46476","15467534544","lengthy string, with commas, multiple: colans","string with or, without commas","string 2","CAND","388","70%","09/21/2013",""

फ़ाइल के 5 वें कॉलम में अलग-अलग तार हैं। मुझे 5 वें कॉलम मान के आधार पर फ़ाइल को फ़िल्टर करने की आवश्यकता है। कहते हैं, मुझे वर्तमान फ़ाइल से एक नई फ़ाइल की आवश्यकता है जिसका रिकॉर्ड केवल उसके पांचवें क्षेत्र में "स्ट्रिंग 1" के साथ है।

इसके लिए मैंने नीचे दिए गए कमांड को आजमाया,

awk -F"," ' { if toupper($5) == "STRING 1") PRINT }' file1.csv > file2.csv

लेकिन यह निम्नलिखित के रूप में मुझे एक त्रुटि फेंक रहा था:

awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error
awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error

मैंने तब निम्नलिखित का उपयोग किया जो मुझे एक अजीब आउटपुट देता है।

awk -F"," '$5="string 1" {print}' file1.csv > file2.csv

आउटपुट:

"column 1" "column 2" "column 3" "column 4" string 1 "column 6" "column 7" "column 8" "column 9" "column 10
"12310" "42324564756" "a simple string with a comma" string 1 without commas" "string 1" "USD" "12" "70%" "08/01/2013" ""
"23455" "12312255564" "string with string 1 commas" "string with or without commas" "string 2" "USD" "433" "70%" "07/15/2013" ""
"23525" "74535243123" "string with commas string 1 "string with or without commas" "string 1" "CAND" "744" "70%" "05/06/2013" ""
"46476" "15467534544" "lengthy string with commas string 1 "string with or without commas" "string 2" "CAND" "388" "70%" "09/21/2013" ""

पुनश्च: मैंने टौपर कमांड का उपयोग सुरक्षित पक्ष पर किया है, क्योंकि मुझे यकीन नहीं है कि स्ट्रिंग कम या उच्च मामले में होगी। मुझे यह जानने की जरूरत है कि मेरे कोड में क्या गलत है और अगर AWK का उपयोग करके पैटर्न खोजते समय स्ट्रिंग में स्थान मायने रखता है।

जवाबों:


17
awk -F '","'  'BEGIN {OFS=","} { if (toupper($5) == "STRING 1")  print }' file1.csv > file2.csv 

उत्पादन

"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""

मुझे लगता है कि यह वही है जो आप चाहते हैं।


आउटपुट बिल्कुल वैसा ही है जैसे मुझे इसकी आवश्यकता थी। मैंने '","'इसे सीमांकक बनाने के बारे में नहीं सोचा है , अन्यथा इससे मेरी समस्या हल हो जाती ... महान समाधान ...
ध्रुव

@ ध्रुव परिसीमन कर रहा '","'है जो आपके पिछले प्रश्न का सबसे उत्तर देता है :)।
terdon

@terdon: हाँ, मुझे पता है, लेकिन यह मेरे दिमाग में नहीं आया था जब मैं इस मुद्दे पर था। सच कहूँ, तो मुझे लगा कि यह कमांड के साथ कुछ हो सकता है या समस्या को पैदा करने वाले सीमांकक के अलावा कुछ और ... :) इसलिए इसने कोशिश नहीं की ... :(
ध्रुव

2
@ ध्रुव विवरणों के बारे में निश्चित नहीं है क्योंकि मैं नहीं बता सकता कि आप क्या करने की कोशिश कर रहे हैं, लेकिन आपकी अन्य शर्त लगभग निश्चित रूप से गलत है। यदि आप $ 5 की राशि है, तो क्या आप इसे प्रिंट करने की कोशिश कर रहे हैं? यदि ऐसा है, तो प्रयास करें else{if(toupper($5)=="HYPERION"){print}}। इस समय मेरे कंप्यूटर पर नहीं है तो मेरे पास वाक्यविन्यास गलत हो सकता है लेकिन आप किसी अन्य विवरण के लिए एक शर्त नहीं दे सकते।
terdon

1
awk -F '","' 'BEGIN {OFS=","} { if (NR==1) {print} else{if (toupper($5) == "STRING 1") print} }' file1
9

2

CSV के साथ समस्या यह है कि कोई मानक नहीं है। यदि आपको अक्सर CSV-स्वरूपित डेटा से निपटने की आवश्यकता होती है, तो आप केवल ","अपने क्षेत्र विभाजक के रूप में उपयोग करने के बजाय अधिक मजबूत विधि में देखना चाह सकते हैं । इस मामले में, पर्ल के Text::CSVCPAN मॉड्यूल नौकरी के लिए असाधारण रूप से अच्छी तरह से अनुकूल हैं:

$ perl -mText::CSV_XS -WlanE '
    BEGIN {our $csv = Text::CSV_XS->new;} 
    $csv->parse($_); 
    my @fields = $csv->fields(); 
    print if $fields[4] =~ /string 1/i;
' file1.csv
"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""

-1
awk 'BEGIN {FS = "," }'  '{ (if toupper($5)  == "STRING 1") print; }'  file1.csv > file2.csv

कहने के लिए क्षमा करें, लेकिन, आपका समाधान फ़ाइल से किसी भी रिकॉर्ड को नहीं लौटाता है ... मुझे लगता है कि जैसा कि परिसीमन जोड़ना '","'होगा, धन्यवाद ... :)
ध्रुव

@Mohsen -1 क्योंकि 1) आपको भागने की ज़रूरत है "या उन्हें फ़ाइल सीमांकक के भागों के रूप में नहीं समझा गया है। ओपी के अन्य प्रश्न के उत्तर देखें और 2) आप बाकी कमांड से BEGIN ब्लॉक को पूरी तरह से अलग कर रहे हैं।" । टूटता यह प्रयास करें awk 'BEGIN {FS = "," }' '{print $0}', आप इसे कोई उत्पादन का उत्पादन देखेंगे भविष्य में, अपने जवाब का परीक्षण कृपया देखने के लिए यदि वे उन्हें पोस्ट करने से पहले वास्तव में काम करते हैं।।
terdon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.