awk -F , -v OFS=, '{gsub(/-/, "", $2); print}' < in.csv > out.csv
abaixo é o meu arquivo csv, eu quero remover todas as ocorrências de - do campo retailer_id e criar novo csv. Por favor ajude ...
>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,--,RAH,BE,,0,08/jan/1897,,[email protected],9923,,ACTIVE,NO,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,,,,,,-,,PENDING,2015-08-27 21:19:30,,,,,0,
awk -F , -v OFS=, '{gsub(/-/, "", $2); print}' < in.csv > out.csv
sed -i 's/--//g' in.cvs > out.cvs
Eu usaria sed
para isso.
$ sed -r -i 's/^([0-9]+,)--,/,/g' file.csv
No entanto, gostei da resposta do Stéphane. Se o campo RETAILER_ID
fosse o décimo campo, por exemplo, expressões regulares para sed
seriam mais feias.
Eu provavelmente faria isso em perl, porque isso permite que você seja seletivo sobre campos nomeados:
#!/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";
}
É um pouco mais longo do que um forro sed
one - mas você pode fazer uma linha se quiser.
Porque esse script usa <>
- esse é o identificador de arquivo mágico, que lê qualquer STDIN ou um arquivo especificado na linha de comando, assim como grep
, sed
etc. Isso significa que você pode fazer perl -i
e inplace edit se esse for seu objetivo. Ou apenas redirecione a saída.