バッシュスクリプト

バッシュスクリプト

最大100万レコードを含むベンダーのファイルが複数あります。

このファイルはもともとWindows環境から来ており、ファイルを取得したときにテキストフィールドの途中にある改行のためにレコードに誤った分割がありました。

私はこれがLinuxに転送中に文字が改行文字として解釈されたために起こったと思いますが、元のWindowsファイルを見たことがないので、私はわかりません。

私が必要とするのは、1行の区切り記号の数を計算し、指定されたしきい値未満の場合にレコードの末尾から改行を削除するルーチンです。たとえば、レコードには29の列があり、28の「パイプ」区切り文字(「|」)が必要です。誤った改行のためにデータを取得すると、2つのレコードが得られ、そのうちの1つに10のフィールドと9つの区切り文字があります。 2番目には19個のフィールドと18個の区切り文字が含まれています。以下は、セキュリティ上の理由でデータを変更する例です。

9999999999|Duck Donald|87|||999999999|9999999999|XX999999|||Z99999|999 Planet Ln|||Trumpet
ville|ZZ|99999||||||ZZ|P|9999999999|F|||

行は「Trumpetville」という単語に分かれています。改行文字が挿入されているか、間違って解釈されたためです。再度区切り記号を数え、区切り記号の数が指定されたしきい値を下回ると、改行を削除するウートインを見つけます。

ベストアンサー1

努力する:

sed -e :1 -e 's/|/|/28;t' -e 'N;s/\n//;t1' < your-file

または:

awk -F'|' '{while (NF < 29 && (getline nextline) > 0)
   $0 = $0 nextline; print}' < your-file

テキストにCRLF Microsoft行区切り文字がある場合は、dos2unixを使用して最初にファイルを処理する必要があります。

おすすめ記事