カンマ区切りのファイルをパイプに置き換えます。ただし、テキスト修飾子フィールドからコンマや引用符などを削除しないで、テキスト修飾子を削除してください。

カンマ区切りのファイルをパイプに置き換えます。ただし、テキスト修飾子フィールドからコンマや引用符などを削除しないで、テキスト修飾子を削除してください。

私のファイルはコンマで区切られたファイルで、テキスト修飾子は〜ですが、要件はカンマで区切られたファイルを見つけて|(パイプ)で区切られたファイルに置き換えてテキスト修飾子を削除することです。 〜しかし、何も削除せず、特殊文字を削除しないでください。引用符、二重引用符、またはテキスト修飾子で表されるデータ。例: ~abc", ~abc" として必要です。

以下は、ソースファイルの内容とファイルが出力または操作されると予想される方法です。

ソースファイル:

364034,2015652205,26722,2015,4,~C25753-4~,~TC25753,~,~2WD Double Cab 144.2" SLT,~,~Y~,40506.16,43555.00,1095.00,~043,005,006,007,003,008,016,041,012,029,068,027,028,033~,3,~2WD Double Cab 144.2"~,~SLT~,6,4,~N~,~S~,~N~,~S~,~N~,~N~,~N~,~~,~ ~,~Confirmed~,~w2015k65m22t5~,~Sierra 2500HD~,~Double Cab Standard Box 2-Wheel Drive SLT~,~Rear Wheel Drive~,~Extended Cab Pickup - Standard Bed~

クリーニング後、次のファイルが必要です。

364034|2015652205|26722|2015|4|C25753-4|TC25753,|2WD Double Cab 144.2" SLT,|Y|40506.16|43555.00|1095.00|043|005|006|007|003|008|016|041|012|029|068|027|028|033|3|2WD Double Cab 144.2"|SLT|6|4|N|S|N|S|N|N|N|| |Confirmed|w2015k65m22t5|Sierra 2500HD|Double Cab Standard Box 2-Wheel Drive SLT|Rear Wheel Drive|Extended Cab Pickup - Standard Bed

複数のオプションを使用してsed -i -eを試しましたが、出力が100%正確ではありません。

フォローしてみましたが、欲しい結果は出ませんでした。

sed -i -e 's/,~/|/g' file_name
sed -i -e 's/~,/|/g' file_name
sed -i -e 's/~//g' file_name
sed -i -e 's/\([0-9],[0-9]\)/|/g' file_name
sed -i -e 's/\r//g' file_name

答え1

ESC=$(printf '\033')
RED="${ESC}[0;31m"
 NC="${ESC}[0m"

sed -e '
   /./!b
   /[^[:space:]]/!b

   s/.*/\
&,/

   :loop
      h
      s/\(\n\),/|\1/;                                                  # An empty field
      s/\(\n\)\([+-]\{0,1\}[.][0-9]\{1,\}\),/\2|\1/;                   # +-.NNN
      s/\(\n\)\([+-]\{0,1\}[0-9]\{1,\}\([.][0-9]*\)\{0,1\}\),/\2|\1/;  # +-NNN.MMM +-NNN. +-NNN
      s/\(\n\)~\([0-9][0-9]*\),/\2|\1/;                                # ~NNN
      s/\(\n\)\([0-9][0-9]*\)~,/\2|\1/;                                # NNN~
      s/\(\n\)~\([^~]*\)~,/\2|\1/;                                     # ~...~
      x;G
      /^\(.*\)\n\1$/{
         g;'"s/\n\([^,]*\)/${RED}\1${NC}/"'
         i\
***'"${RED}ERROR${NC}"'*** Unable to process the field shown colored.\
\
Cause of error: What this means is that this particular field is not \
\
           Fix: You should add to the sed code in the :loop label to \
                digest the able to be processed by the sed code as it stands.\
\
The record with the offending field shown colored red:\

         q
      }
      g; # all clear: recover and carry on...
   /\n$/!bloop

   s/..$//
' csv.data

布材

  • 私たちのソリューションはさまざまな種類のドメインに基づいています。
  • 空白行または空白行をスキップします。
  • 使用された正規表現を単純化するために、「、」を追加すると最後に削除されます。
  • ボールを転がすには、行の\n先頭にマーカーを配置します。マーカーは一度処理されたフィールドをスキップして左から右に移動します。
  • ジョブはdo-whileループで始まり、ループ本体内で一度に1つのフィールドを処理します。フィールドはで表示され始め、表示される可能性のある\nさまざまなフィールドをカバーします。毎回処理されたフィールドを左に移動してに\n置き換え,ます|
  • マーカーが行の終わりに達すると、\nループが停止し、最初に配置されたダミーオブジェクト/\n$/とともにマーカーを削除します。,

結果

364034|2015652205|26722|2015|4|C25753-4|TC25753,|2WD Double Cab 144.2" SLT,|Y|40506.16|43555.00|1095.00|043|005|006|007|003|008|016|041|012|029|068|027|028|033|3|2WD Double Cab 144.2"|SLT|6|4|N|S|N|S|N|N|N|| |Confirmed|w2015k65m22t5|Sierra 2500HD|Double Cab Standard Box 2-Wheel Drive SLT|Rear Wheel Drive|Extended Cab Pickup - Standard Bed

答え2

Perlなどの専用CSVパーサーを使用することをお勧めします。テキスト::CSV

perl -MText::CSV -lne '
    BEGIN{ $csv = Text::CSV->new({ quote_char => "~" , escape_char => "~" , allow_whitespace => 1}) } 
    print join "|", $csv->fields() if $csv->parse($_)
  ' file_name
364034|2015652205|26722|2015|4|C25753-4|TC25753,|2WD Double Cab 144.2" SLT,|Y|40506.16|43555.00|1095.00|043,005,006,007,003,008,016,041,012,029,068,027,028,033|3|2WD Double Cab 144.2"|SLT|6|4|N|S|N|S|N|N|N|| |Confirmed|w2015k65m22t5|Sierra 2500HD|Double Cab Standard Box 2-Wheel Drive SLT|Rear Wheel Drive|Extended Cab Pickup - Standard Bed

関連情報