-4

最近、同じフォーラムで質問したところ、解決策が見つかりました。残念ながら、UNIX に変換する必要があります。問題は、csv ファイルからの行をマージすることでした。各行はセミコロン (;) で終了する必要があり、セミコロンが再び見つかるまで次の行を結合しない場合。

私のために働いた解決策は

@echo off
setlocal disableDelayedExpansion
set "ln="
for /f delims^=^ eol^= %%i in (myfile.txt) do (
    set "var=%%i"
    setlocal enableDelayedExpansion
    if "!var:~-1!"==";" (echo !var!>>temp.csv) else (<nul set /p ="!var!">>temp.csv)
    endlocal
)

UNIXスクリプトに変換することはできますか?

元の投稿へのリンクは次のとおりです。 バッチファイルを使用して、最後の文字がセミコロンの場合、行を次の行とマージします

4

2 に答える 2

0

次回テキスト処理をしたい場合は、ウィンドウに行かないでください。:D

あなたが持っていると仮定して:

A;1;abc;<xml/>;
;2;def;<xml
>hello world</xml>;
;3;ghi;<xml/>;

あなたのルールは次のとおりです。

行がセミコロン (;) で終わっていない場合は、次の行を現在の行に結合するように、行を結合する必要があります。

awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' file

テスト

kent$  echo "A;1;abc;<xml/>;
;2;def;<xml
>hello world</xml>;
;3;ghi;<xml/>;"|awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}'
A;1;abc;<xml/>;
;2;def;<xml>hello world</xml>;
;3;ghi;<xml/>;

この場合にも機能します。

kent$  cat ttt
A;1;abc;<xml/>;
;2;def;<xml
>h
e
l
l
o w
o
rld<
/xm
l>;
;3;ghi;<xml/>;

kent$  awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' ttt
A;1;abc;<xml/>;
;2;def;<xml>hello world</xml>;
;3;ghi;<xml/>;
于 2013-01-17T17:02:31.883 に答える
0

sed は私のオプションです。

sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt 

sed は各行を読み取り、それぞれにタグ (:a) を設定してから、行に ; がないかどうかを確認します。(/[^;]$/) ; がない場合 N は次の行を読み取り、それを現在の行に追加して、新しい行で区切ります。s/\n// 改行 ta チェックを削除して、置換が成功したかどうかを確認し、成功した場合は :a タグにジャンプしてチェックを再開します

于 2013-01-17T17:06:53.493 に答える