como alterar uma coluna e adicionar outras colunas em uma linha pelo awk

4

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
    
por user3548033 23.09.2015 / 14:53

4 respostas

4

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
    
por 23.09.2015 / 15:04
6

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
    
por 23.09.2015 / 15:05
4

com awk :

awk 'BEGIN{OFS=FS="|"} {$2="XYZ"; $0=$0"|"FILENAME"|SUCCESS"}1' mdd.txt

Onde:

  • O 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.
por 23.09.2015 / 15:09
2

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"}'
    
por 23.09.2015 / 16:42