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$5
como el quinto campo y así sucesivamente.{gsub("_",FS,$5)}
Reemplace todo el_
en el quinto campo conFS
. Es decir, con|
.1
Activa la acción predeterminada de awk: imprime el registro actual (modificado).
Respuesta2
Con sed
siempre 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 awk
una) 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 -a
make perl
actúan como awk
, dividiendo cada línea de entrada del carácter dado por -F
en 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 awk
soluciones 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.