処理のためにプレーンテキストに変換した表形式データのPDFファイルを受け取りました。
pdftotext -nopgbrk -layout file.pdf
これはかなりまともな仕事をしますが、列のフィールドを区切る/区切るためにスペースを使用し、「構造的な」レイアウトではなく視覚的なレイアウトを維持することに主に関心があるようです。つまり、一貫したまたは信頼できる区切り文字はありません。そこで、2つ以上のスペースをタブに変換します。
sed -i 's/[[:space:]]\{2,\}/\t/g' file.txt
を使用するcat -vte
と、これはファイルにタブを配置するのに非常に効果的であることがわかります....ただし、2番目のフィールドにはいくつかの矛盾があります。
明確にするために、次の比較を参照してください。
正常/期待される結果:
79879 5.6 0.5 MG EN SQ TFK World Report 09-24-2004 Time for Kids Editors、ORD1915643 79880 5.5 0.5 MG EN SQ TFK World Report 10-01-2004 Time for Kids Editors、ORD1915643 79881 6.0 0.5 MG EN SQ TFK World Report 10-08-2004 Time for Kids Editors、ORD1915643 79882 5.5 0.5 MG EN SQ TFK World Report 10-22-2004 Time for Kids Editors、ORD1915643 79883 5.9 0.5 MG EN SQ TFK World Report 10-29-2004 Time for Kids Editors、ORD1915643
いくつかの奇妙な点と矛盾点:
72 5.2 3.0 MG EN LSラモーナと彼女の父クリアリー、ビバリーORD2111460 491 4.8 4.0 MG EN LSラモーナと彼女の母親クリアリー、ビバリーORD1748201 134 5.6 3.0 MG EN LSラモーナクインビー、8歳クリアリー、ビバリーORD1748201 29 4.7 5.0 MG EN LSバジル・E・コニグスブルク夫人の混合ファイルから、EL ORD1525579
「スマッシング」効果は、フィールド2またはフィールド3のいずれかで発生する可能性があることに注意してください... AND、フィールドの数は、「通常の」結果と1または2だけ異なります。
...だから、これを解決するために、私は次のようなものを試しました:
awk -F'\t' 'OFS="\t";$1 ~ /^[[:digit:]]/{print $1,gensub(/[[:space:]]/,"\t","g",$2),$3,$4,$5,$6,$7}' file.txt
これは、それぞれ、または少なくともほとんどの行を2倍にし、フィールドを切り取るようです。
編集 これは機能しているようです...これまでのところ、まだテスト中です。
awk -F'\t' '{$2 = gensub( /[[:space:]]/, "\t", "g", $2 );
$3 = gensub( /[[:space:]]/, "\t", "g", $3 )}
{OFS="\t";print}' file.txt
awkを使用してこの問題を解決する簡単な方法はありますか?
アップデート
スペースタブ変換の直前の状態を表すサンプルを要求する人もいます。以下は、前のサンプルがドキュメント内にある場所の近くのサンプルを表しています。ほぼ同じように見えます...一方[下]が間隔を空けて、もう一方[上]がタブ付きであることを除いて。pdftotextが以下のさまざまなサンプルの列2を処理する方法に注意してください...場合によっては分割され、場合によっては単一の列が作成されます。
サンプル1:
72 5.2 3.0 MG EN RPラモーナと彼女の父クリアリー、ビバリーORD0630871 孤児です 491 4.8 4.0 MG EN RPラモーナと彼女の母親クリアリー、ビバリーORD0785414 孤児でもあります 186 4.8 4.0 MG EN RPラモーナフォーエバークリアリー、ビバリーORD0630871 永遠に孤児
サンプル2:
79871 5.7 0.5 MG EN SQ TFK World Report 03-18-2005 Time for Kids Editors、ORD1915643 79872 5.8 0.5 MG EN SQ TFK World Report 04-01-2005 Time for Kids Editors、ORD1915643 79873 6.0 0.5 MG EN SQ TFK World Report 04-08-2005 Time for Kids Editors、ORD1915643
更新2
エドの提出物に以下の変更を加えました。単純化できると思いますが、機能します。孤立した回線を考慮に入れる必要があります。
$1 ~ /^[[:digit:]]+/{
for (i=1;i<=6;i++)
printf "%s\t", $i
n = split($0,tmp,/ +/)
for (i=2;i>=0;i--)
printf "%s\t", tmp[n-i]
print ""
}
$1 ~ /^[^[:digit:]]+/ {print $0}
多分これはもっときれいです:
{
if ($1 ~ /^[[:digit:]]+/) {
for (i=1;i<=6;i++)
printf "%s\t", $i
n = split($0,tmp,/ +/)
for (i=2;i>=0;i--)
printf "%s\t", tmp[n-i]
print ""
}
else print $0;
}