ソースをフラットファイルにインポートし、キャリッジリターンと\ n ...特殊文字を削除しますか?

ソースをフラットファイルにインポートし、キャリッジリターンと\ n ...特殊文字を削除しますか?

\nPIPE区切り文字を含む多数のレコードを含むフラットファイルソースが提供され、フィールドの1つがキャリッジリターン(複数行)を受け取り、改行()で始まる問題が発生しました。それでは、\nファイルから文字を削除する方法は?

例:

-000123456|1654321|6/12/2002 8:49:20 AM|
tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|

誰でも進行方法を提案できますか?

答え1

\nすべてのレコードでフィールドがこのフィールドで始まることがわかっている場合は、sed次のように使用できます。

sed "N;s/|\n/|/"

新しい行を削除します。行区切り文字sedとして使用されるため、まず\n次の行をすでに処理されている行に接続し、Nプロセスのsedリンクされた行の間に改行文字を挿入する必要があります。

この問題がランダムに発生する場合(すべてのレコードで発生するわけではありません)、ファイルの内容を解析するためにより強力なツールを使用する必要があります。デフォルトではフィールド数を数える必要があります。または、awkこのトリックをエレガントに実行することもできます。 (私の考えperlでは、それも実行できるようですが、おそらく行きたくありません。)sedその方向)。

答え2

利用可能なツールはたくさんありますが、sedこれらのツールは次の目的で作成されました。

 sed -i 's,\\n,,g' Flatfile

どのように動作するかを示すために、入力した入力と同じ式は次のとおりです。

$ echo '-000123456|1654321|6/12/2002 8:49:20 AM|\n tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|' | sed 's,\\n,,g'
-000123456|1654321|6/12/2002 8:49:20 AM| tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|

ただ文字列を見つけて、\n長さ0の空の文字列に置き換えます(効果的に削除)。が2つあるため、特別な(改行)意味を失い、2文字で一致することがあります\\n

関連情報