2017-03-23 3 views
1

Mes fichiers d'entrée d'origine est une liste de transactions de réservation. Je suis intéressé par les lignes qui sont dans les deux sections: a) les transactions et b) les remboursements. Ceux-ci sont toujours au bas des CSV et structurés.awk two regex conditions - structure complexe transactions alambiquées complexe csv

Je peux passer toutes les lignes au-dessus de la transaction de la section via la condition regex/transaction/{print}.

Je voudrais ajouter une colonne avec des chaînes "transaction ou remboursements" selon la section dans le csv. Donc je sais si un cloumn est une transaction ou un remboursement. quelque chose comme

IF ($2 = "transaction" || " " != "refunds"){$7=="transaction"}; 
IF ($2 = "refunds" || " " != "transaction"){$7=="refunds"} 

Je partage le CSV et script.awk sur mon GDrive et espère que cela est acceptable: convoluted transaction list to be structured

transaction date  via  Details  payment fee   
 
      28-02-2015 invoice txn1  44.1  0.19  
 
      28-02-2015 invoice txn2  27.7  0.19  
 
      07-03-2015 invoice txn3  43.1  0.19  
 
      09-03-2015 invoice txn4  36.8  0.19  
 
      12-03-2015 invoice txn5  26   0.19  
 
      13-03-2015 invoice txn6  43.7  0.19  
 
      13-03-2015 invoice txn7  25.6  0.19  
 
      15-03-2015 creditcard txn8  70.8  0.19  
 
            Sum   317.8  1.52  
 
refunds Datum  via  Details  payment 1.52   
 
      18-12-2014 invoice txn0   16   
 
            Sum   16

Mon résultat escompté est la suivante:

date  via  Details  payment fee  type 
 
28-02-2015 invoice txn1   44.1  0.19  transaction 
 
28-02-2015 invoice txn2   27.7  0.19  transaction  
 
07-03-2015 invoice txn3   43.1  0.19  transaction  
 
09-03-2015 invoice txn4   36.8  0.19  transaction  
 
12-03-2015 invoice txn5   26  0.19  transaction  
 
13-03-2015 invoice txn6   43.7  0.19  transaction  
 
13-03-2015 invoice txn7   25.6  0.19  transaction  
 
15-03-2015 creditcard txn8   70.8  0.19  transaction  
 

 
18-12-2014 invoice txn0   16     refund  

Mon extrait au moment:

BEGIN {OFS=FS=";" 
print {date,payment option,detailspayment,fee,type } 

/^transactions/,/^$/{ 
if ($3=="via) {next}; 
if ($6=="Sum") {next}; 
print $2 FS $3 FS $4 FS $5 FS $6 FS $7; 
} 
+0

Cela fait longtemps que je n'ai pas utilisé awk, mais est-ce que cette ligne '/^Transaktionen /,/^ $ /' remplace Transaktionen par,? – user2141046

+0

J'avais besoin d'imprimer toutes les lignes suivantes après/Transaktionen/a été trouvé. Le code donné semble fonctionner. Par le livre en utilisant/Transaktionen/{} il a imprimé seulement la ligne suivante. – prestalearner

+0

Désolé pas clair. $ 0 est la ligne complète et vous l'utilisez certainement pour $ 1 qui est le 1er élément (champ). Ajouter un record (vous voulez dire champ je suppose) 14 $ mais imprimer seulement le champ partiel (9 sur 13). Donnez un petit échantillon de source et le résultat attendu vous aidera [pas d'accès à votre lien] – NeronLeVelu

Répondre

0
awk ' 
    NR == 1 { 
    $1 = "" 
    print $0, "type" 
    type = "transaction" 
    next 
    } 
    $1 == "refunds" { 
    print "" 
    type = "- refund" 
    } 
    /^/&& NF > 3 { 
    print $0, type 
    }' input.txt |column -t 

Sorties:

date  via   Details payment fee type 
28-02-2015 invoice  txn1  44.1  0.19 transaction 
28-02-2015 invoice  txn2  27.7  0.19 transaction 
07-03-2015 invoice  txn3  43.1  0.19 transaction 
09-03-2015 invoice  txn4  36.8  0.19 transaction 
12-03-2015 invoice  txn5  26  0.19 transaction 
13-03-2015 invoice  txn6  43.7  0.19 transaction 
13-03-2015 invoice  txn7  25.6  0.19 transaction 
15-03-2015 creditcard txn8  70.8  0.19 transaction 
18-12-2014 invoice  txn0  16  -  refund 

Je suis en cela par column -t afin d'aligner les colonnes, mais qui enlève le saut de ligne ajouté avant le remboursement. Une autre différence est le tiret utilisé pour la "taxe" de remboursement qui est nécessaire pour que column -t fonctionne correctement.

Dans le code awk, si le nombre d'enregistrements (numéro de ligne, NR) est 1, supprimez le premier élément et imprimez le reste plus "type", puis nous passons à la ligne suivante. Si cette ligne commence par "remboursements" alors nous imprimons une ligne vierge et ensuite modifions le type à "rembourser" (puisqu'il n'y a pas de frais, nous l'indiquons avec un tiret). Enfin, si nous avons des espaces de premier plan et que le nombre de champs (NF) est 4+, nous imprimons la ligne plus le type.

Le code awk peut être tout sur une ligne si vous utilisez des points-virgules entre les commandes dans les actions.