Reemplace "_" con "|" en un archivo en el quinto campo solamente

Reemplace "_" con "|" en un archivo en el quinto campo solamente

Mi archivo tiene el siguiente contenido:

rat|minty|ruhul|balaji|rat_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2_123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Necesito reemplazar _con |pero solo en el quinto campo.

Rendimiento esperado:

rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Respuesta1

Con awk, usogsub()en el quinto campo:

$ awk 'BEGIN{FS=OFS="|"} {gsub("_",FS,$5)}1' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Explicación

  • BEGIN{FS=OFS="|"}
    Establezca el separador de campos en |. De esta manera, podemos abordarlo $5como el quinto campo y así sucesivamente.
  • {gsub("_",FS,$5)}
    Reemplace todo el _en el quinto campo con FS. Es decir, con |.
  • 1
    Activa la acción predeterminada de awk: imprime el registro actual (modificado).

Respuesta2

Con sedsiempre que el quinto campo solo tenga uno _para ser reemplazado

$ sed -E 's/^(([^|]+\|){4}[^_]+)_/\1|/' ip.txt 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Solución con perl(similar a awkuna) si _se van a reemplazar todos los del quinto campo:

$ perl -F'\|' -lane '$F[4] =~ tr/_/|/; print join "|",@F' ip.txt 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Respuesta3

Con perl:

$ perl -F'\|' -ne '$F[4]=~s/_/|/; print join "|", @F' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Los -amake perlactúan como awk, dividiendo cada línea de entrada del carácter dado por -Fen campos guardados en la matriz @F. Luego, sustituimos _con |en el quinto campo (las matrices comienzan en 0, al igual $F[4]que el quinto campo) y luego imprimimos la matriz unida por |.

También puede configurar el separador de matriz en |e imprimir, "@F"lo que hace lo mismo pero de manera más concisa:

$ perl -F'\|' -ne '$"="|"; $F[4]=~s/_/|/; print "@F"' file
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Por supuesto, en su ejemplo específico, el _campo 5 también es el primero en la línea, por lo que si su archivo es realmente así, basta con hacer:

$ perl -pe 's/_/|/' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

O

$ sed 's/_/|/' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Puede utilizar el mismo enfoque con awk:

$ awk -F'|' 'sub("_","|")' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

O, para especificar solo el quinto campo y reemplazar todas las apariciones de _en el quinto campo, una versión más corta deLa respuesta de @fedorqui:

$ awk -F'|' -vOFS='|' 'gsub("_","|",$5)' file 
rat|minty|ruhul|balaji|rat|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat1|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat
rat|minty|ruhul|balaji|rat2|123|decode|rat_123|abc|def|ghi|jkl|rat|cde|ind|rat

Tenga en cuenta que estas dos awksoluciones solo se imprimirán en las líneas donde la sustitución fue exitosa. Si puede tener líneas que no coincidan con el patrón (no _en el quinto campo), use el enfoque de @fedorqui o uno de Perl.

información relacionada