通过修改字段和记录分隔符使用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 。我不确定正则表达式的内部实现方式,但我猜测它们实际上指的是文件的开头和结尾,而不是行。作为解决方法,我设置了一段换行符结尾。然而,这意味着如果一行的末尾可以有一个或多个,它就会中断。我不知道如何从一开始就匹配,因为第一行失败了。$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 

相关内容