1

エクスポートされたCSVがあり、一部の行のレコードの途中に改行(ASCII 012)があります。これをスペースに置き換える必要がありますが、ロードするレコードごとに新しい行を保持します。

ほとんどの行は問題ありませんが、かなりの数の行にこれがあります。

入力:

10 , ,"2007-07-30 13.26.21.598000" ,1922 ,0 , , , ,"Special Needs List Rows updated :
Row 1 : Instruction: other :Comment: pump runs all of the water for the insd's home" ,10003 ,524 ,"cc:2023" , , ,2023 , , ,"CCR" ,"INSERT" ,"2011-12-03 01.25.39.759555" ,"2011-12-03 01.25.39.759555"

出力:

10 , ,"2007-07-30 13.26.21.598000" ,1922 ,0 , , , ,"Special Needs List Rows updated :Row 1 : Instruction: other :Comment: pump runs all of the water for the insd's home" ,10003 ,524 ,"cc:2023" , , ,2023 , , ,"CCR" ,"INSERT" ,"2011-12-03 01.25.39.759555" ,"2011-12-03 01.25.39.759555"

私はAwkを調べてきましたが、実際の行を保持する方法を実際に理解することはできません。

もう一つの例:

入力:

9~~"2007-08-01 16.14.45.099000"~2215~0~~~~"Exposure closed (Unnecessary) : Garage door working
Claim Withdrawn"~~701~"cc:6007"~~564~6007~~~"CCR"~"INSERT"~"2011-12-03 01.25.39.759555"~"2011-12-03 01.25.39.759555"
4~~"2007-08-01 16.14.49.333000"~1923~0~~~~"Assigned to user Leanne Hamshere in group GIO Home Processing (Team 3)"~~912~"cc:6008"~~~6008~~~"CCR"~"INSERT"~"2011-12-03 01.25.39.759555"~"2011-12-03 01.25.39.759555"

出力:

9~~"2007-08-01 16.14.45.099000"~2215~0~~~~"Exposure closed (Unnecessary) : Garage door working Claim Withdrawn"~~701~"cc:6007"~~564~6007~~~"CCR"~"INSERT"~"2011-12-03 01.25.39.759555"~"2011-12-03 01.25.39.759555"
4~~"2007-08-01 16.14.49.333000"~1923~0~~~~"Assigned to user Leanne Hamshere in group GIO Home Processing (Team 3)"~~912~"cc:6008"~~~6008~~~"CCR"~"INSERT"~"2011-12-03 01.25.39.759555"~"2011-12-03 01.25.39.759555"
4

3 に答える 3

4

使用する1つの方法GNU awk

awk -f script.awk file.txt

内容script.awk

BEGIN {
    FS = "[,~]"
}

NF < 21 {
    line = (line ? line OFS : line) $0
    fields = fields + NF
}

fields >= 21 {
    print line
    line=""
    fields=0
}

NF == 21 {
    print
}

または、次のワンライナーを使用することもできます。

awk -F "[,~]" 'NF < 21 { line = (line ? line OFS : line) $0; fields = fields + NF } fields >= 21 { print line; line=""; fields=0 } NF == 21 { print }' file.txt

説明:

私はあなたの期待される出力について観察しました:各行は正確に21のフィールドを含むべきであるようです。したがって、行に含まれるフィールドが21未満の場合は、行を保存し、フィールドの数を保存します。次の行にループすると、その行はスペースで格納された行に結合され、フィールドの数が合計されます。このフィールド数が21以上の場合(破線のフィールドの合計は22に加算されます)、格納されている行を印刷します。それ以外の場合、行に21フィールド(NF == 21)が含まれている場合は、それを印刷します。HTH。

于 2012-09-25T07:49:54.487 に答える
2

sedはあなたの選択だと思います。すべてのレコードがコロン以外の文字で終わっていると思います。したがって、行がコロンで終わっている場合、それは例外として認識され、前の行に連結する必要があります。

コードは次のとおりです。

cat data | sed -e '/[^"]$/N' -e 's/\n//g'

最初の実行-e '/[^"]$/N'は異常なケースと一致し、バッファを空にすることなく次のレコードを読み込みます。次に-e 's/\n//g'、改行文字を削除します。

于 2012-09-25T01:11:24.940 に答える
2

このワンライナーを試してみてください:

awk '{if(t){print;t=0;next;}x=$0;n=gsub(/"/,"",x);if(n%2){printf $0" ";t=1;}else print $0}' file

アイデア:1行の数を数えます"。カウントが奇数の場合は、次の行を結合します。そうでない場合、現在の行は完全な行と見なされます。

于 2012-09-25T13:28:20.627 に答える