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