comment changer une colonne et append d'autres colonnes dans une ligne par awk

J'ai un file MDD.TXT avec les loggings suivants. file: 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 

Maintenant, je veux replace la deuxième colonne par "XYZ" et vouloir append deux noms de file de colonne et "succès" dans tous les loggings. la sortie souhaitée doit être la suivante:

 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 

Vous pouvez essayer de suivre 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 

Vous pouvez aussi utiliser sed

 $ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT 

Pour effectuer la modification directement dans le file

 $ sed -i -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT 

Pour conserver le file d'origine et redirect la sortie voulue vers d'autres

 $ sed -e 's/\bABC\b/XYZ/g' -e 's/$/|MDD.TXT|SUCCESS/g' MDD.TXT >> MDD_MODIFFIED.TXT 

Avec awk :

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

Où:

  • Le BEGIN{} n'est exécuté qu'au début, pas pour chaque ligne.
  • OFS=FS="|" définit le séparateur de champs d'input et de sortie sur | .
  • $2="XYZ" définit le deuxième champ sur XYZ
  • $0=... ajoute à la ligne entière FILENAME (des variables internes de awk ) et SUCCESS tant que string.

C'est la même idée que les réponses awk existantes mais un peu plus concis:

 awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT","SUCCESS"}' MDD.TXT 

Pour l'append automatiquement (pour n'importe quel nom de file), utilisez:

 awk -F'|' -vOFS="|" '{$2="XYZ"; print $0,ARGV[1],"SUCCESS"}' MDD.TXT 

Le -F définit le séparateur d'loggings d'input et le -vOFS définit la variable OFS , le séparateur d'loggings de sortie. Ensuite, nous définissons le deuxième champ sur XYZ et imprimons la ligne ( $0 ), le nom de file ( ARGV[1] ) et SUCCESS .

Notez que dans votre exemple, vous avez des espaces de fin sur chaque ligne, donc l'exécution de l'une des solutions proposées entraînera:

 $ 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 

Pour éviter cela, vous pouvez définir le séparateur de champs d'input sur | ou espace:

 $ 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

Ou, vous pouvez simplement supprimer les espaces blancs avant d'parsingr le file:

 sed 's/\s*$//' MDD.TXT | awk -F' |' -vOFS="|" '{$2="XYZ"; print $0,"MDD.TXT|SUCCESS"}'