J'essaye de concaténer toutes les 2 et 3 lignes au milieu de la ligne 1; avant le dernier caractère de tabulation de la ligne 1 spécifiquement.
Voici un échantillon des données que j'ai comme sortie d'un terrible système bancaire. Chaque première ligne commence par une date au format MM / JJ suivie d'un caractère de tabulation et se termine par un montant en dollars précédé d'un caractère de tabulation.
05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64 05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24 05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR ESTABLISHMENT * IL 4885434317495585 42.50
Comme vous pouvez le voir, j'essaie de concaténer les lignes 2 et 3 et de les mettre avant le dernier caractère de tabulation de la ligne 1. Donc, en gros,
XXX
J'espère que cela a du sens. J'ai parcouru une tonne de messages ici, et bien qu'ils aient tous été utiles, la plupart d'entre eux concernaient la fusion de 2 lignes ensemble, ou leur impression dans un fichier, etc. Merci d'avance pour votre aide.
4 Réponses :
Pourriez-vous s'il vous plaît essayer de suivre (comme il est conseillé d'ajouter vos efforts dans votre message, veuillez le faire dans votre message).
05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64 05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24 05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR ESTABLISHMENT * IL 4885434317495585 42.50
Le résultat sera le suivant.
awk ' /^[0-9]+\/[0-9]+/{ if(value){ print value,val value=val="" } found=1 val=$NF sub(/.*/,"",$NF) value=$0 next } found{ value=(value?value OFS:"")$0 } /^[0-9]*$/{ found="" } END{ if(value){ print value,val } }' Input_file
Compte tenu de vos exemples de données et de votre résultat, une méthode harcode
peut être:
ruby -aF"\t" -ne 'case $.%3;when 1; tvar=$F[-1];gsub(/\t[^\t]*$/," ");print $_; when 2; print $_.chomp + " ";else; puts $_.chomp + "\t" + tvar;end'
Une autre façon (GNU awk):
awk 'BEGIN{FS=OFS="\t"}FNR%3==1{tvar=$NF;NF--;printf $0 " "}FNR%3==2{printf $0 " "}FNR%3==0{print $0,tvar}'
Utilisation de Perl,
$ perl -0777 -ne ' while( /^(\d+.+?)\n(.+?)\n(.+?)\n/msg ) { $x=$1;$a="$2 $3";@z=$x=~/\s+(\S+)$/g; $x=~s/$z[0]$//g; print "$x $a $z[0]\n" } ' stanley.txt 05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64 05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24 05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR ESTABLISHMENT * IL 4885434317495585 42.50 $
ou
$ perl -0777 -ne ' while( /^(\d+.+?)\n(.+?)\n(.+?)\n/msg ) { $x=$1;$a="$2 $3";$y=$x;$y=~s/.*\s+([\d\.]+)$/\1/g; $x=~s/$y$//g; print "$x $a $y\n" } ' stanley.txt 05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64 05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24 05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR ESTABLISHMENT * IL 4885434317495585 42.50 $
ou
$ cat stanley.txt 05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR 30.64 ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR 181.24 ESTABLISHMENT 555 5551212 * TX 4885434317495585 05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR 42.50 ESTABLISHMENT * IL 4885434317495585 $ perl -0777 -ne ' while( /^(\d+.+?)\n(.+?)\n(.+?)\n/msg ) { $x=$1;$a=$2;$c=$3;$y=$x;$y=~s/.*\s([\d\.]+)$/\1/g; $x=~s/$y$//g; print "$x $a $c $y\n" } ' stanley.txt 05/04 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 941 00009415 MAYS LNDG * MN 4885434317495585 30.64 05/07 DEBIT CARD PURCHASE, AUT 055329 VISA DDA PUR ESTABLISHMENT 555 5551212 * TX 4885434317495585 181.24 05/07 DEBIT CARD PURCHASE, AUT 050418 VISA DDA PUR ESTABLISHMENT * IL 4885434317495585 42.50 $
Cela pourrait fonctionner pour vous (GNU sed):
sed -E 'N;N;s/^(.*\S)(\s+\S+)\n(.*)\n(.*)/\1 \3 \4\2/' file
Ajoutez les deux lignes suivantes à la ligne actuelle et en utilisant la correspondance de modèle, combinez des groupes de chaînes au format requis.
Il est préférable de montrer d'abord ce que vous avez essayé et les résultats.
Bienvenue sur SO @Stanley, il est toujours conseillé d'ajouter 3 choses simples dans vos messages. 1- échantillon d'entrée, 2-échantillon de sortie et 3ème - vos tentatives dans les balises de code symbole
{}
. Nous demandons que les efforts des gens soient ajoutés dans leurs questions, car nous sommes tous ici pour apprendre.