Usando o AWK para adicionar uma nova coluna com valores a um arquivo csv sem criar novas linhas vazias entre as linhas

1

Eu gostaria de adicionar uma nova coluna ao final de um arquivo csv e preencher a coluna com valores. Eu usei os seguintes códigos e ele acaba mostrando novas linhas em branco entre cada registro. Por favor, deixe-me saber como evitar essas novas linhas em branco.

awk -F "," 'NR == 1 {$5="MonthYear"}{ if (NR>1){split($2,a,"[/ ]");$5=a[1]"/"a[3]}}1' RS='\r' OFS="," Test.csv > Test1.csv

tentou com RS = '\ n' e RS = '\ r \ n' e ainda obtém o mesmo resultado

Arquivo de entrada - Test.csv

Id  Day UserId  ItemId              
1   12/1/17 0:03    2323    tv              
2   12/14/17 7:10   4546    frr             
3   1/22/18 14:11   2421    fdf             
4   2/16/18 13:36   4545    dfdf                
5   3/5/18 10:47    1232    dfsdf   

Arquivo de saída real - Test1.csv

Id  Day UserId  ItemId  MonthYear

1   12/1/17 0:03    2323    tv  12/17

2   12/14/17 7:10   4546    frr 12/17

3   1/22/18 14:11   2421    fdf 1/18

4   2/16/18 13:36   4545    dfdf    2/18

5   3/5/18 10:47    1232    dfsdf   3/18

Saída esperada - csv

Id  Day UserId  ItemId  MonthYear       
1   12/1/17 0:03    2323    tv  12/17       
2   12/14/17 7:10   4546    frr 12/17       
3   1/22/18 14:11   2421    fdf 1/18        
4   2/16/18 13:36   4545    dfdf    2/18        
5   3/5/18 10:47    1232    dfsdf   3/18

Sem RS, a saída é misturada assim:

,MonthYearrId,ItemId
,12/17/17 0:03,2323,tv
,12/174/17 7:10,4546,frr
,1/182/18 14:11,2421,fdf
,2/186/18 13:36,4545,dfdf
5,3/5/18 10:47,1232,dfsdf,3/18
    
por thinkingsavvy 17.09.2018 / 20:42

3 respostas

0

A única maneira de reproduzir seu problema é se o arquivo contiver ponto e vírgula como delimitadores e cada linha termina em um par \r\n . Quando isso acontece, usar o \r como o RS faz com que o \n esteja na próxima linha.

Arquivo de origem usado:

Id,Day,UserId,ItemId
1,12/1/17 0:03,2323,tv
2,12/14/17 7:10,4546,frr
3,1/22/18 14:11,2421,fdf
4,2/16/18 13:36,4545,dfdf
5,3/5/18 10:47,1232,dfsdf

A solução mais simples é remover o \r no arquivo (talvez usando dos2unix).
Mais fácil de fazer dentro do awk:

$ awk '{gsub(/\r/,"")}; NR==1 {print $0,"MonthYear"}; NR>1 {print $0,$2"/"$4}' FS="[,/ ]" OFS=, Test.csv
Id,Day,UserId,ItemId,MonthYear
1,12/1/17 0:03,2323,tv,12/17
2,12/14/17 7:10,4546,frr,12/17
3,1/22/18 14:11,2421,fdf,1/18
4,2/16/18 13:36,4545,dfdf,2/18
5,3/5/18 10:47,1232,dfsdf,3/18
    
por 17.09.2018 / 22:00
0

Consegui resolver isso removendo os registros em branco do arquivo de saída usando sed '/^ *$/d' Test1.csv > Test2.csv

    
por 17.09.2018 / 21:47
0

Outra abordagem awk

$ awk '{print $0,NR==1?" MonthYear":substr($2,0,index($2,"/"))substr($2,length($2)-1)}' Test.csv
Id  Day UserId  ItemId  MonthYear
1   12/1/17 0:03    2323    tv 12/17
2   12/14/17 7:10   4546    frr 12/17
3   1/22/18 14:11   2421    fdf 1/18
4   2/16/18 13:36   4545    dfdf 2/18
5   3/5/18 10:47    1232    dfsdf 3/18
$
    
por 17.09.2018 / 23:18

Tags