0
votes

Unix aide à déplacer les lignes 2 et 3 vers le milieu de la ligne 1

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.


2 commentaires

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.


4 Réponses :


0
votes

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


0 commentaires

0
votes

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}'


0 commentaires

1
votes

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

$


0 commentaires

0
votes

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.


0 commentaires