com 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
O -a
faz com que perl
aja como awk
, dividindo cada linha de entrada no caractere dado por -F
nos campos salvos na matriz @F
. Em seguida, substituímos _
por |
no quinto campo (as matrizes começam em 0, então $F[4]
é o quinto campo) e, em seguida, imprimimos a matriz unida por |
.
Você também pode definir o separador de matriz como |
e imprimir "@F"
, que faz a mesma coisa, mas de forma mais 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
Naturalmente, no seu exemplo específico, o _
no quinto campo também é o primeiro da linha, então se o seu arquivo é realmente assim, é o suficiente para fazer:
$ 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
Ou
$ 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
Você pode usar a mesma abordagem com 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
Ou, para especificar apenas o quinto campo e substituir todas as ocorrências de _
no quinto campo, uma versão menor de Resposta do @ 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
Observe que essas duas soluções awk
só serão impressas nas linhas em que a substituição foi bem-sucedida. Se você pode ter linhas que não combinam com o padrão (sem _
no quinto campo), use a abordagem de @ fedorqui ou uma das perl em vez disso.