Remova as várias vírgulas da coluna específica do arquivo delimitado por tabulações e imprima as palavras na nova linha

2

Arquivo de entrada

jayesh  30,20,50,60 30:20:40,60:55  A   AB,KL,CD        SM1,SM2
rahul   10,80,50,90 25:55:60,25     SGF AAAA,BCD,RTY    SM3,SM4,SM4
pravin  89,78,40,20 25:30:55,96:25  M   J               SD10,SD12
sarika  10,20,48    29:50:30,25     T   K,L             SD20,SD39

Eu quero remover as vírgulas da coluna 5 e imprimir essas palavras na nova linha que estão presentes após a vírgula (Nota: - cada célula da quinta coluna contém muitas vírgulas, mas eu mostro apenas algumas)

Saída esperada

jayesh  30,20,50,60      30:20:40,60:55 A   AB   SM1,SM2
jayesh  30,20,50,60      30:20:40,60:55 A   KL   SM1,SM2
jayesh  30,20,50,60      30:20:40,60:55 A   CD   SM1,SM2
rahul   10,80,50,90,120  25:55:60,25    SGF AAAA SM3,SM4,SM4
rahul   10,80,50,90,120  25:55:60,25    SGF BCD  SM3,SM4,SM4
rahul   10,80,50,90,120  25:55:60,25    SGF RTY  SM3,SM4,SM4
pravin  89,78,40,20      25:30:55,96:25 M   J    SD10,SD12
sarika  10,20,48         29:50:30,25    T   K    SD20,SD39
sarika  10,20,48         29:50:30,25    T   L    SD20,SD39

Eu tentei o seguinte usando awk, mas não dando resultados esperados. (para escrever código eu recebo ajuda deste site Como remover a vírgula e imprimir toda a linha novamente para as palavras que são colocadas após a vírgula )

awk '{
split ($5,w5,",");
for (i in w5) 
{ print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6";}}'

@sundeep, quando eu tentei o seguinte comando para o meu arquivo de entrada, a 5ª e a 6ª coluna se misturam (eu mostro aqui o total de 6 colunas, mas meu arquivo tem mais de 6 colunas)

a seguinte saída é obtida quando eu abro o arquivo de saída no excel

saída

$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt

jayesh  30,20,50,60 30:20:40,60:55  A   "ABSM1,SM2" 
jayesh  30,20,50,60 30:20:40,60:55  A    KL         SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A    CD"        SM1,SM2
rahul   10,80,50,90 25:55:60,25     SGF  AAAASM3,SM4,SM4"   
rahul   10,80,50,90 25:55:60,25     SGF  BCD        SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25     SGF  RTY"       SM3,SM4,SM4
pravin  89,78,40,20 25:30:55,96:25  M    J          SD10,SD12
sarika  10,20,48    29:50:30,25     T    KSD20,SD39"    
sarika  10,20,48    29:50:30,25     T    L"         SD20,SD39
    
por rohan 18.11.2016 / 12:43

1 resposta

3

O comando awk usado pelo OP só tem problema de sintaxe, a instrução "; no final da impressão

$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt
jayesh  30,20,50,60 30:20:40,60:55  A   AB  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   KL  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   CD  SM1,SM2
rahul   10,80,50,90 25:55:60,25 SGF AAAA    SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin  89,78,40,20 25:30:55,96:25  M   J   SD10,SD12
sarika  10,20,48    29:50:30,25 T   K   SD20,SD39
sarika  10,20,48    29:50:30,25 T   L   SD20,SD39

Além disso, pode definir o separador de campos de saída para uma sintaxe mais limpa, obrigado @fedorqui pela sugestão

awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { print $1,$2,$3,$4,w5[i],$6 } }' ip.txt

ou

awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { $5 = w5[i]; print } }' ip.txt


Solução semelhante com perl

$ perl -lane 'print join "\t", @F[0..3],$_,@F[5..$#F] foreach split /,/,$F[4]' ip.txt 
jayesh  30,20,50,60 30:20:40,60:55  A   AB  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   KL  SM1,SM2
jayesh  30,20,50,60 30:20:40,60:55  A   CD  SM1,SM2
rahul   10,80,50,90 25:55:60,25 SGF AAAA    SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul   10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin  89,78,40,20 25:30:55,96:25  M   J   SD10,SD12
sarika  10,20,48    29:50:30,25 T   K   SD20,SD39
sarika  10,20,48    29:50:30,25 T   L   SD20,SD39
    
por 18.11.2016 / 13:17

Tags