Você pode tentar seguir awk
:
awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; $6 = ARGV[1]; $7 = "SUCCESS";} 1' MDD.TXT
ou:
awk 'BEGIN { FS = OFS = "|" } { $2 = "XYZ"; print $0 OFS ARGV[1] OFS "SUCCESS"; }' MDD.TXT
Eu tenho um arquivo MDD.TXT com os seguintes registros. arquivo: MDD.TXT
0|ABC|055309|20120929053309|11965150
0|ABC|061434|20120929063434|11155537
0|ABC|070228|20120929073228|11965150
0|ABC|082213|20120929583213|11965150
0|ABC|083950|20120929983950|11965150
0|ABC|084112|20120929083112|11965150
Agora eu quero substituir a segunda coluna por "XYZ" e quero adicionar duas colunas filename e "success" em todos os registros. a saída desejada deve seguir:
0|XYZ|055309|20120929053309|11965150|MDD.TXT|SUCCESS
0|XYZ|061434|20120929063434|11155537|MDD.TXT|SUCCESS
0|XYZ|070228|20120929073228|11965150|MDD.TXT|SUCCESS
0|XYZ|082213|20120929583213|11965150|MDD.TXT|SUCCESS
0|XYZ|083950|20120929983950|11965150|MDD.TXT|SUCCESS
0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS
Você também pode usar sed
$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT
Para fazer a modificação no arquivo diretamente
$ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT
Para manter o arquivo original e redirecionar a saída desejada para outro
$ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT
com awk
:
awk 'BEGIN{OFS=FS="|"} {$2="XYZ"; $0=$0"|"FILENAME"|SUCCESS"}1' mdd.txt
Onde:
BEGIN{}
é executado apenas no começo, não para cada linha. OFS=FS="|"
define o separador de campos de entrada e saída como |
. $2="XYZ"
define o segundo campo como XYZ
$0=...
acrescenta à linha inteira o FILENAME
(de awk
s variáveis internas) e SUCCESS
como uma string. Esta é a mesma ideia que o awk
existente responde, mas um pouco mais conciso:
awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT","SUCCESS"}' MDD.TXT
Para adicionar o nome do arquivo automaticamente (para qualquer nome de arquivo), use:
awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT
O -F
define o separador de registro de entrada e o -vOFS
define a variável OFS
, o separador de registro de saída. Em seguida, definimos o segundo campo como XYZ
e imprimimos a linha ( $0
), o nome do arquivo ( ARGV[1]
) e SUCCESS
.
Observe que, no seu exemplo, você tem espaços em branco à direita em cada linha, portanto, executar qualquer uma das soluções propostas resultará em:
$ awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT
0|XYZ|055309|20120929053309|11965150 |MDD.TXT|SUCCESS
0|XYZ|061434|20120929063434|11155537 |MDD.TXT|SUCCESS
0|XYZ|070228|20120929073228|11965150 |MDD.TXT|SUCCESS
0|XYZ|082213|20120929583213|11965150 |MDD.TXT|SUCCESS
0|XYZ|083950|20120929983950|11965150 |MDD.TXT|SUCCESS
0|XYZ|084112|20120929083112|11965150|MDD.TXT|SUCCESS
Para evitar isso, você pode definir o separador do campo de entrada como |
ou espaço:
$ awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT
0|ABC|055309|20120929053309|11965150|XYZ|||MDD.TXT|SUCCESS
0|ABC|061434|20120929063434|11155537|XYZ||MDD.TXT|SUCCESS
0|ABC|070228|20120929073228|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|082213|20120929583213|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|083950|20120929983950|11965150|XYZ||MDD.TXT|SUCCESS
0|ABC|084112|20120929083112|11965150|XYZ|MDD.TXT|SUCCESS
Você pode simplesmente remover o espaço em branco à direita antes de analisar o arquivo:
sed 's/\s*$//' MDD.TXT |
awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT|SUCCESS"}'
Tags awk shell-script