2

我有一组最初来自(格式不佳的)PDF 的通话记录。问题是当放置在文本编辑器中时,每条记录都会出现多行。数据似乎在字段中间“自动换行”。但是,有足够的结构,我认为脚本可以检测和修复错误换行的行(通过修复,我的意思是脚本将所有记录的数据放在一行上,而不是跨多行喷射)。

示例输入:

8/21/201  
3  
08:4  
8  
817817935300 39 Inbound ARLINGTON 0:01 3001  
8/21/201  
3  
08:5  
2  
816036924529 26 Inbound WINTHROP 0:06 3001  
8/21/201  
3  
09:3  
1  
814697446313 48 Inbound SHINGLEHSE 0:01 7800  

对于这三个记录,输出应该是:

8/21/2013 08:48 8178179353 39 Inbound ARLINGTON 0:01 3001  
8/21/2013 08:52 8160369245 26 Inbound WINTHROP 0:06 3001  
8/21/2013 09:31 8146974463 48 Inbound SHINGLEHSE 0:01 7800 

我不偏爱任何特定的方法。似乎 awk、sed 或 Perl 中的任何一个都可能是好的开始,我只是在脚本方面太新手,无法及时解决这个问题。

我试图在 Excel / VBA 中利用的一种模式是每条记录都以日期戳开始,因此每条记录都包含在从日期戳开始并在下一个日期戳之前结束的行的“块”中。不过,我的代码不够健壮,无法处理它,未来可能会出现我认为 awk / sed / Perl 脚本可能更适合处理的问题。

4

4 回答 4

2

既然你告诉我们each record is contained in a "block" of lines starting from a date stamp and ending one line before the next date stamp

$ awk -v OFS='\t' '
/^[[:digit:]]{1,2}\/[[:digit:]]{1,2}\/[[:digit:]]{1,4}/ {
    if (rec) print rec
    rec=""
}
{ rec = rec (rec?OFS:"") $0 }
END {if (rec) print rec }
' file
8/21/201        3       08:4    8       817817935300 39 Inbound ARLINGTON 0:01 3001  
8/21/201        3       08:5    2       816036924529 26 Inbound WINTHROP 0:06 3001  
8/21/201        3       09:3    1       814697446313 48 Inbound SHINGLEHSE 0:01 7800

设置OFS你认为合适的。

于 2013-10-28T21:02:05.390 回答
1

使用 sed:

sed -n 'N;s/\n//;N;s/\n/ /;N;s/\n//;N;s/\n/ /;p' input
于 2013-10-28T20:28:20.487 回答
1
perl -pe 'chomp; s|^(\d+/)|\n$1| if $. >1' file
于 2013-10-28T20:32:57.753 回答
1

使用 awk (如果所有行都被拆分 5 次):

awk 'NR%5{printf "%s", $0;next}1' file

或基于相同算法使用的另一种解决方案:

perl -ne 'chomp; $.%5 && printf "%s", $_ or print "$_\n"' file

编辑:完全符合您的预期:

perl -0777ne '
    my @arr = m!(\d+/\d+/\d+)\n(\d+)\n(\d+:\d+)\n(\d+)\n(\d+.*?\n)!g;
    my $i;
    for ($i=0; $i<$#arr; $i+=5) {
        print "$arr[$i]$arr[$i+1] $arr[$i+2]$arr[$i+3] $arr[$i+4]";
    }
' file 
于 2013-10-28T20:51:25.337 回答