शेल स्क्रिप्ट में एक फ़ील्ड से '-' की किसी भी घटना को निकालें


1

नीचे मेरी सीएसवी फ़ाइल है, मैं रिटेलर_ड फील्ड से - की सभी घटनाओं को हटाकर नया सीएसवी बनाना चाहता हूं।

>IPAY_USER_ID,RETAILER_ID,CUST_FIRST_NAME,CUST_LAST_NAME,CUST_MIDDLE_NAME,ACTIVATION_ACTOR_ID,DATE_OF_BIRTH,GENDER,EMAIL_ID,MOBILE_NO,CUSTOMER_CATEGORY,CUST_STATUS,WALLET_TYPE,MOBILE_CIRCLE,MPIN_EXPRY_DATE,R_MOD_ID,R_MOD_TIME,R_CRE_ID,CREATION_DATE,CREATION_TIME,RETAILER_UPGRADE_REG_DATE,RETAILER_UPGRADE_REG_TIME,DEDUP2_DATE,DEDUP2_TIME,DATA_ENRICHMENT_DATE,DATA_ENRICHMENT_TIME,BLACKLIST_DATE,BLACKLIST_TIME,DEDUP3_DATE,DEDUP3_TIME,KYCN_P_Registration_Mode,CHANNEL,TD_PD_STATUS,DEFAULT_MPIN_CHANGED_OR_NOT,UPGRADE_CHANNEL,UPGRADE_STATUS,LAST_TXN_DATE,KYCF_CONVERSION_DATE,KYCF_CONVERSION_TIME,NOMINEE_NAME,RELATION_CODE,BALANCE,SEEDING AUTHORISATION ID
22909943,--,RAL,WAL,,0,08/jan/1997,,RjhL@GMAIL.COM,9923,,ACTIVE,NOKYC,RJ,2025-08-27 21:19:30,22909943,2015-11-05 17:21:17,22909943,2015-08-27,21:19:30,,,,,,,2015-11-05,17:21:17,,,SELF,WEB,,-,,PENDING,2015-08-27 21:19:30,,,,,0,

क्या आप के साथ बदलना चाहते हैं?
आठबेटटोनी

जवाबों:


4
awk -F , -v OFS=, '{gsub(/-/, "", $2); print}' < in.csv > out.csv

क्या आप मुझे बता सकते हैं कि आपने इस आवश्यकता के लिए aw में -v विकल्प का उपयोग क्यों किया?
सिद्धार्थ जैन

@siddharthajain, -vएक चर परिभाषा है, यहाँ आउटपुट फ़ील्ड विभाजक विशेष चर है। -F ,के लिए छोटा है -v FS=,। विवरण के लिए awk मैन पेज की जाँच करें।
स्टीफन चेजलस

अनुसूचित जाति के जवाब में जोड़ने के लिए, विशेष कारण क्यों यह ओएफएस स्थापित करने के लिए आवश्यक है कि आप इसे सेट नहीं है करने के लिए है ,तो किसी भी लाइनों है कि को बदल रहे थे gsub()करने के लिए बदल समारोह ओएफएस होगा awkकी डिफ़ॉल्ट (एक भी अंतरिक्ष) तो यह अब CSV फ़ाइल नहीं होगी। अपरिवर्तित लाइनें अपने मूल क्षेत्र विभाजक (एक अल्पविराम) को बनाए रखेंगी
cas

BTW, यह विशिष्ट नहीं है gsub()- यह किसी भी आउटपुट लाइन द्वारा संशोधित होगा awk
कैस

@ स्टीफनचेज़ेलस धन्यवाद, लेकिन क्या होगा अगर मैं कई और विशिष्ट क्षेत्रों से '-' चरित्र को हटाना चाहता हूं।
सिद्धार्थ जैन 5

0
sed -i 's/--//g'  in.cvs > out.cvs

2
क्यों -आई और रीडायरेक्ट?
जेफ स्कालर

यद्यपि मूल प्रश्न स्पष्ट नहीं है यदि --कहीं और दिखाई देता है, तो वह समाधान जोखिम की हर घटना को प्रतिस्थापित करता है, --भले ही यह फ़ाइल में रहता हो। यह थोड़ा बदलने के लिए सुरक्षित हो जाएगा ,--,के साथ ,,लेकिन फिर भी है कि जोखिम भरा है अगर यह किसी अन्य क्षेत्र में दिखाई दे सकते हैं और अभी भी आवश्यक हो।
आठबेटटोनी

0

मैं उसके लिए उपयोग करूंगा sed

$ sed -r -i 's/^([0-9]+,)--,/\1,/g' file.csv

हालांकि, मुझे स्टीफन का जवाब पसंद आया। यदि RETAILER_IDक्षेत्र दसवां क्षेत्र था, उदाहरण के लिए, नियमित अभिव्यक्ति sedबदसूरत होगी।


0

मैं शायद इसे पर्ल में करूंगा, क्योंकि यह आपको नामित क्षेत्रों के बारे में चयनात्मक होने की अनुमति देता है:

#!/usr/bin/env perl
use strict;
use warnings;

#read header row from "STDIN" (or file on command line); 
chomp ( my @header = split /,/, <> );
#print it
print join ",", @header, "\n";
#iterate STDIN or file on command line - line by line
while ( <> ) {
    #declare a row
    my %this_row;
    #strip trailing linefeed (optional, given you need to reinsert it)
    chomp;
    #select fields in this row, into named fields based on the header row. 
    @this_row{@header} = split /,/;
    #apply regex to just RETAILER_ID
    $this_row{'RETAILER_ID'} =~ s/--//;
    #print row. map is unnecessary if you've always got a full set of fields.  
    #I've included it because your sample data didn't. 
    print join ( "," , map { $_ // '' } @this_row{@header} ),"\n";
}

यह sedएक लाइनर की तुलना में थोड़ा लंबा है - लेकिन यदि आप चाहते हैं तो आप इसे एक-पंक्ति-ify कर सकते हैं।

क्योंकि यह स्क्रिप्ट उपयोग करता है <>- वह मैजिक फ़ाइल हैंडल है, जो या तो STDIN पढ़ता है या कमांड लाइन पर निर्दिष्ट फ़ाइल, जैसे grep, sedआदि। इसका मतलब यह है कि, यदि आप perl -iअपना लक्ष्य बना सकते हैं, तो आप इसे कर सकते हैं । या सिर्फ आउटपुट को रीडायरेक्ट करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.