バッシュスクリプト

バッシュスクリプト

最大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を使用して最初にファイルを処理する必要があります。

答え2

必要ないと仮定するとキャリッジリターンと改行データによると本当ですいいえフィールドの先頭に表示され、次のことができます。

予想交換キャリッジリターンと改行Linux EOLラインの終わりに、もし

これはパイプ文字の後に発生する必要があります。直接またはスペースで区切られます。したがって、文字列「パイプスペースCRLF」および「パイプCRLF」を「パイプスペースLF」または「パイプLF」に置き換えます。

0x7C 0x20 0x0D 0x0Aそして0x7C 0x0D 0x0A

到着

0x7C 0x20 0x0Aそして0x7C 0x0A

キャリッジリターンと改行残りはデータにあります。 「CRLF」文字列を空白またはnull値に置き換えます。

0x0D 0x0A到着0x20

編集する:

予想されるEOLは2つのパイプの間になければなりません。

|データ|キャリッジリターンと改行

|データ|

0x7C 0x0D 0x0A 0x7C

答え3

バッシュスクリプト

もともと答えが実際に望むものではないことを読んだ。以下のスクリプトを参照してください。これは、入力ファイルの要素数を事前に知っている場合にのみ機能します。

#!/bin/bash

infile=/home/wokie/duck.txt
outfile=/home/wokie/duck2.txt
# Define the amount of elements/columns in a row
maxelem=28

# Read the file, strip all newline characters and create one big variable
inputOneline=$(cat $infile | dos2unix | tr -d '\n')

count=0
# Read through the variable and split elements
for element in ${inputOneline//|/ }
  do
  if [ $count -lt $maxelem ]
    then
      # Write element to outfile while suppresing newline (-n) 
      echo -n "$element|" >> $outfile
      count=$[$count +1]
    else
      # Write newline to outfile when maximum elements is reached
      echo >> $outfile
      count=0
  fi
done

全体的なアイデアは、最初にすべての改行文字を削除してから、改行文字を含む新しいファイルを正しい場所に配置することです。

DOS 2 Unix

このスクリプトはdos2unixという素晴らしいツールを使用しています。ファイル名のみを引数として dos2unix を実行すると、入力 (Windows) ファイルは自動的に unix 形式に変換されます。

-idパラメーターを使用してツールを開始すると、CRLFの発生回数が計算されます。たとえば、次のようになります。

[test@testsystem ~]$ dos2unix -id /home/wokie/test2.txt 5 /home/wokie/test2.txt

サンプルファイルには5回表示されます。

dos2unixツールはここにあります: https://sourceforge.net/projects/dos2unix/。ほとんどのディストリビューションは、dos2unixを標準で提供するか、apt-getまたはdnfを使用してインストールする可能性を提供します。

関連情報