このCSVからグループ化コンマを削除して変数の数を2に変更したいと思います。

このCSVからグループ化コンマを削除して変数の数を2に変更したいと思います。

最初の数行には、次のCSVがあります。

c("4288", "57534"),MIB1
c("2272", "2385"),FHIT
c("5550", "10531", "56239"),PREP
c("25809", "23669"),TTLL1

括弧内にグループ化されたすべての項目が1つの変数になるように変数数を操作したいと思います。残念ながら、私の文書には、括弧内に複数のカンマ区切り値を持つ3行などの複数の項目があります。

括弧内のカンマでのみ機能するsed式はありますか?

予想される出力は次のとおりです。

c("4288" "57534"), MIB1
c("2272" "2385"),FHIT
c("5550" "10531" "56239"),PREP
c("25809" "23669"),TTLL1

乾杯。

答え1

高度な正規表現perlには使用しないでください。sed

perl -pe 's/(?:\G[^,)]*|\([^,)]*)\K,(?=.*?\))//g' input.csv
c("4288" "57534"),MIB1
c("2272" "2385"),FHIT
c("5550" "10531" "56239"),PREP
c("25809" "23669"),TTLL1

これにより、括弧内に表示されるすべてのコンマが削除されます。

答え2

私はすでに同じ解決策で答えましたここ、これはあなたの質問にも適用され、ここで少し修正されました。

sed -E ':loop s/(\([^)]*),([^)]*\))/\1\2/; t loop' infile

分解:

ノート:エスケープされていない文字クラス(または)外部文字クラスは、エスケープされた文字[...]クラスと一致するために使用されます。\(合計は負の一致です。\)[...]()^[^)]任意の単一文字ですが、)」。

それから私達は次を持っています:

(\([^)]*):最初のグループのゲームは\1後ろにある審判を意味します。
,: 単一のカンマに一致します。
([^)]*\)):2番目のゲームセットを遡って\2言います。

次の例の行を検討し、一致がどのように機能するかを説明します。

c(("4288", "57534", "somtoher")),d("f1", "f2", "f3"),MIB1

これは(\([^)]*),([^)]*\))次のように一致します。

  1. 最初の開き括弧から始まり、(aを除くすべての項目から最後の閉じ括弧まで)。したがって、最初の一致セットは上記の例の行の一部と一致します。,)\1(("4288", "57534",

  2. 次に、最後から,最初の閉じ括弧までのすべての内容と)それ自体が2番目の一致セットに含まれ、上記の例の行の一部に\2なります。"somtoher")

  3. replacementセクションでは、\1\2一致する2つのグループを再インポートしますが、それらの間のカンマを削除します。

  4. :loop s///; t loop; sedループ内の(&の間のすべてのコンマ(ラベルとして使用されます)がクリアされるまで、手順1〜3を実行します。)loop

    最初の試みでは、サンプル行は次のように変更されます。

    c(("4288", "57534" "somtoher")),d("f1", "f2", "f3"),MIB1
    

    2番目の試みは次のとおりです。

    c(("4288" "57534" "somtoher")),d("f1", "f2", "f3"),MIB1
    

    3番目の試みは次のとおりです。

    c(("4288" "57534" "somtoher")),d("f1", "f2" "f3"),MIB1
    

    など。

関連情報