2017-03-23 10 views
1

私のオリジナル入力ファイルは予約トランザクションリストです。私は2つのセクションにあるラインに興味があります:a)取引とb)払い戻し。 これらは常にCSVの下部にあり、構造化されています。awk 2つの正規表現条件 - 複雑な構造の複雑なトランザクションリストcsv

regex condition/transaction/{print}を使用して、セクショントランザクションの上のすべての行をスキップできます。

csvのセクションに応じて、「トランザクションまたは払い戻し」という文字列を含む列を追加したいとします。だから私はcloumnが取引か払い戻しかどうか知っています。

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

のようなもの、私は私のgdriveにCSVやscript.awkを共有し、これは許容可能であると思います: 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

私の意図した結果がこれです:

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  

現時点での私のスニペット:

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

私は最後にawkを使っていましたが、この行は '/^Transaktionen /、/^$ /'ではありません。 – user2141046

+0

/Transaktionen /が見つかった後、次の行をすべて印刷する必要がありました。与えられたコードはうまくいくようです。/Transaktionen/{}を使った本では、次の行だけが表示されていました。 – prestalearner

+0

ごめんなさい。 $ 0は完全な行で、1番目の要素(フィールド)である$ 1に使用します。レコードを追加する(あなたが推測するフィールドを意味する)$ 14が、部分フィールドのみが印刷されます(13のうち9つ)。小さなソースのサンプルを与えると結果が助けになる[あなたのリンクへのアクセスはありません] – NeronLeVelu

答えて

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 

出力:

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 

列をラインアップするために、それは削除されても、私は、column -tを介してこれを実行していますよ追加された行は払い戻し前に中断されます。別の違いは、column -tが正しく機能するために必要な払い戻しの「手数料」に使用されるダッシュです。

awkコードでは、レコード数(行番号NR)が1の場合、最初の項目を削除し、残りの部分に "type"を加えて次の行に移動します。その行が「払い戻し」で始まっている場合は、空白行を印刷して、タイプを「払い戻し」に変更します(料金はかからず、ダッシュで示します)。最後に、先行スペースがあり、フィールド数(NF)が4+であれば、ライン+タイプを出力します。

アクション内のコマンド間でセミコロンを使用すると、awkコードはすべて1行になります。