フィールドとレコードの区切り文字を変更して awk を使用して解析

フィールドとレコードの区切り文字を変更して awk を使用して解析

次のファイルがあります。

------------------------------------------------------------------------------------------------------------------------------------------------------------------
49515 23/6/2014 SL B                                              .OO                                  2500.00
          R ROY                             4561235
BEING THE T.E PAID
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
23495 26/7/2014  CL A                                     2300.00                                         .00
          S DAS                             2334167
BEING THE MONEY RECOVERED 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

私が望む出力は次のとおりです。

49515 23/6/2014  SL B                      .00                2500.00       R ROY          4561235        BEING THE T.E PAID
23495  26/7/2014  CL A             2300.00                        .00       S DAS          2334167       BEING THE MONEY RECOVERED

私は大きな成功なしにawkで次のコードを試しましたが、アイデアは改行をフィールド区切り文字に設定し、ハイフン(-------)行をレコード区切り文字に設定することです。

BEGIN {
   FS="/n"
   RS="^-+$"}
{ print $1,$2,$3}

答え1

これにより、必要な操作が実行されます。

awk '/---/ {print buff; buff="";} /[^-]/{buff=buff" "$0}'  filename

if-else ブロックを使用することもできます。

awk '{if($0 ~ /---/){print buff; buff=""} else {buff=buff" "$0}}' filename

また、バッファを使わずに:

awk '{if($0 !~ /---/){printf "%s ", $0} else print ""}' filename

答え2

ほぼすべて来ました:

$ awk -F'\n' -vRS="-+\n" '($1){print $1,$2,$3; }' file
49515 23/6/2014 SL B                                              .OO                                  2500.00           R ROY                             4561235 BEING THE T.E PAID
23495 26/7/2014  CL A                                     2300.00                                         .00           S DAS                             2334167 BEING THE MONEY RECOVERED 

またはBEGINブロックを好む場合:

awk 'BEGIN{FS="\n"; RS="-+\n"}($1){print $1,$2,$3; }' file

問題(/n誤字と推定される)は、 の^定義に and を使用したことです。正規表現が内部的にどのように実装されるかはわかりませんが、実際には行ではなくファイルの先頭と終わりを参照しているようです。回避策として改行の終わりを設定しました。ただし、これは行の末尾に1つ以上がある場合は破棄されることを意味します。最初の行が失敗して最初からどのように合わせるべきかわかりません。$RSRSRS--\n-+\n

同様のアプローチは、^-+$空行を置き換えてPerlの短絡モードを使用することです。

$ sed 's/--*/\n/' file | perl -F'\n' -00ane 'print "@F\n";' 
49515 23/6/2014 SL B                                              .OO                                  2500.00           R ROY                             4561235 BEING THE T.E PAID
23495 26/7/2014  CL A                                     2300.00                                         .00           S DAS                             2334167 BEING THE MONEY RECOVERED 

関連情報