1

かなり大きなcsvファイルがあり、各行はパイプ(|)で終了する必要があります。パイプが再び見つかるまで、次の行が結合されない場合。これは、シェルスクリプトを使用して行う必要があります。

私は答えを得ました

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

しかし、各行のサイズが非常に大きいため、エラーが発生します。私はそれを行うためにperlを使用する必要があることを知り、以下のように何かを試しましたが、それは望ましい結果を生み出します。

perl -pe 's/^\n(|\n)/ /gs' input.csv > output.csv

私のデータは次のようになります

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

そして、望ましい出力は

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

明らかに、行サイズはここに入力されたサンプルよりもかなり大きいです。

どんな助けでも大歓迎です。

4

3 に答える 3

1
awk '{printf "%s",$0} /[|][[:space:]]*$/ {print ""}' 

改行なしですべての行を印刷します。最後の非空白文字がパイプの場合、完全な行があるので、改行を印刷します。

于 2013-01-18T16:12:07.640 に答える
0

これにより、すべてのケースが問題なく処理され、行の長さが途切れることはありません。

#!/bin/bash
newLine=0
IFS=
while read -r -n 1 char; do
    if [[ $char =~ ^$ ]]; then
        if [[ $newLine -eq 1 ]]; then
            newLine=0
            echo '|' # add a newline
        fi  
    elif [[ $char =~ . && ( $newLine -eq 1 ) ]]; then
        newLine=0
        echo -n "|$char"
    elif [[ $char =~ [|] ]]; then
        if [[ $newLine -eq 1 ]]; then
            echo -n '|'
        fi  
        newLine=1
    else
        echo -n $char
    fi  
done < file.txt

bashで手動でレクサーを作成することは通常悪い考えであることに注意してください。

于 2013-01-18T15:06:17.850 に答える
0

これは機能するはずです:

perl -lne 'unless(/\|$/){$line=$line.$_}else{print $line." $_";undef $line}' your_file

インプレース交換を行う場合は、次のようにします。

perl -i -lne 'unless(/\|$/){$line=$line.$_}else{print $line." $_";undef $line}' your_file

コメントについてはこちらをご覧ください

于 2013-01-18T14:10:47.043 に答える