2

私は、もともと (フォーマットが不適切な) PDF から取得した一連の通話記録を持っています。問題は、テキスト エディターに配置したときに、各レコードが複数の行にまたがって表示されることです。データは、フィールドの途中で「ワードラップ」されているようです。ただし、スクリプトが誤って折り返された行を検出して修正できると思われる十分な構造があります (修正とは、スクリプトがレコードのすべてのデータを複数の行に吐き出すのではなく、1 行に配置することを意味します)。

入力例:

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  

これら 3 つのレコードの場合、出力次のようになります。

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 で利用しようとしていたパターンの 1 つは、各レコードが日付スタンプで始まることでした。そのため、各レコードは、日付スタンプから始まり、次の日付スタンプの 1 行で終わる行の「ブロック」に含まれます。ただし、私のコードはそれを処理するのに十分なほど堅牢ではありませんでした.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
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 に答える
1

sed を使用:

sed -n 'N;s/\n//;N;s/\n/ /;N;s/\n//;N;s/\n/ /;p' input
于 2013-10-28T20:28:20.487 に答える