誤って生成されたファイルのフィールドを修正する[閉じる]

誤って生成されたファイルのフィールドを修正する[閉じる]

正しく生成されていないテキストファイルがあります。テキストファイルを作成した人に出力内容を修正するように依頼していますが、これは時間がかかります。

ファイルには、|パイプ()区切り文字で区切られた9つのフィールドを含める必要があります。残念ながら、2番目のフィールドは返品縦棒で区切られた複数のフィールド。そしてエスケープや引用は使われません。したがって、9つよりはるかに多くのフィールドがあります。

最初のフィールドと最後の7つのフィールドをそのまま使用し、中間フィールドを単一のフィールドに変換したり、区切り文字を抑制したり、スペースに置き換えてこの問題を解決したいと思います。

いくつかの例:

field1|field2|field3||||||field9
1a|DAVID|JOY|02022|4|5|6|7|8|9
1b|DAVID|JOY|ZYN|02022|4|5|6|7|8|9

出力になると予想します。

field1|field2|field3||||||field9
1a|DAVIDJOY|02022|4|5|6|7|8|9
1b|DAVIDJOYZYN|2022|4|5|6|7|8|9

シェルレベルツールを使用してこれをどのように実行できますか?

ベストアンサー1

GNUでは、sed次のことができます。

sed ':1;s/|/|/9;T;s/|//2;t1'

|出力にフィールドが9個以下になるまで、2番目のフィールドと3番目のフィールドを必要なだけ連結します(2番目の項目を削除)。

次のように入力すると:

1|a|3|4|5|6|7|8|9
1|a|b|3|4|5|6|7|8|9
1|a|b|c|3|4|5|6|7|8|9

それは以下を提供します:

1|a|3|4|5|6|7|8|9
1|ab|3|4|5|6|7|8|9
1|abc|3|4|5|6|7|8|9

GNU以外のシステムでは、次のものを使用できます。@RakeshSharmaのPOSIXsedバリアントまたはperl次に変更:

perl -F'[|]' -lae 'BEGIN {$" = ""; $, = "|"}
                   print $F[0], "@F[1..$#F-7]", @F[-7..-1]'

おすすめ記事