【问题标题】:How merge multi-line string within a pattern (but excluding the pattern)?如何在模式中合并多行字符串(但不包括模式)?
【发布时间】:2019-05-12 06:51:09
【问题描述】:

我有一个逗号分隔的 CSV 文件(来自数据库),但不幸的是,最后一个字段是双引号多行字符串,如下所示:

138749,CJIKMN,"d4IFtjCCBbIGCSqGSIb3DQEHAqCCBaMwggWfAgEDMQ0wCwYJYIZIAWUDBAIBMG4GBmeBCAEBAaBk
BGIwYAIBADALBglghkgBZQMEAgEwTjAlAgEBBCAeyMDmgdZS30d5JSraWWoUX50J1vKONjxUYxK9
iPZWWjAlAgECBCCzqs7CzH7+3j3trSz+/dcCmud3/Jo9ZYFmN4VTvTjB56CCBBowggQWMIIDnaAD
Lp69+Z3QgAIgHOYjzAQlDRHnDJ/zDtlkWN5pq7T7h3ef9Mnv4ocSuAA="
136065,CIJEPY,"d4IF4jCCBd4GCSqGSIb3DQEHAqCCBc8wggXLAgEDMQ0wCwYJYIZIAWUDBAIBMIGYBgZngQgBAQGg
gY0EgYowgYcCAQAwCwYJYIZIAWUDBAIBMHUwJQIBAQQgNQdsXvKebYUdH0JybzpY2evf+v9Xg86b
hkjOPQQDAjBBMQswCQYDVQQGEwJHQjEOMAwGA1UEChMFVUtLUEExIjAgBgNVBAMTGUNvdW50cnkg
LUxRjUXbTgfGwUKOFwemsc4KXbsLZ13MkbNfAQ=="

如何合并这些多行,不包括引号,保持其余部分不变?我能想到的都是: sed '/\"/{n;:l N;/\"/b; s/\n//; bl}' sampleOut.txt 但这不是我想要的。我正在寻找这个:

138749,CJIKMN,d4IFtjCCBbIGCSqGSIb3DQEHAqCCBaMwggWfAgEDMQ0wCwYJYIZIAWUDBAIBMG4GBmeBCAEBAaBkBGIwYAIBADALBglghkgBZQMEAgEwTjAlAgEBBCAeyMDmgdZS30d5JSraWWoUX50J1vKONjxUYxK9iPZWWjAlAgECBCCzqs7CzH7+3j3trSz+/dcCmud3/Jo9ZYFmN4VTvTjB56CCBBowggQWMIIDnaADLp69+Z3QgAIgHOYjzAQlDRHnDJ/zDtlkWN5pq7T7h3ef9Mnv4ocSuAA=

知道我该怎么做吗? awk 也可以。

-桑

【问题讨论】:

    标签: bash awk sed pattern-matching


    【解决方案1】:

    您能否尝试以下操作(稍后会添加说明)。

    awk '
    /,\"/{
      val=$0
      gsub(/\"/,"",val)
      next
    }
    /\"$/{
      gsub(/\"/,"")
      print val $0
      val=""
      next
    }
    {
      gsub(/\"/,"")
      val=val?val $0:$0
    }
    END{
      if(val){
        print val
      }
    }'  Input_file
    

    说明:现在为上述代码添加说明。

    awk '
    /,\"/{                 ##Checking condition if a line has comma with " in it then do following.
      val=$0               ##Assigning current line value to variable val here.
      gsub(/\"/,"",val)
      next                 ##Using next will skip all further statements.
    }
    /\"$/{                 ##Checking condition if a line is ending with " then do following.
      gsub(/\"/,"")
      print val $0         ##Printing variable val and current line value here.
      val=""               ##Nullifying variable val value here.
      next                 ##Using next will skip all further statements.
    }                      ##Closing block for condition here.
    {
      gsub(/\"/,"")
      val=val?val $0:$0    ##Creating a variable named val whose value is current line value and its concatenating its own value in it.
    }
    END{                   ##END section of awk is getting started here.
      if(val){             ##Checking condition if variable val is NOT NULL, if yes then do following.
        print val          ##Printing variable val value here.
      }                    ##Closing block of if condition here.
    }' Input_file          ##mentioning Input_file name here.
    

    【讨论】:

    • 我认为您已经假设特定字段应该是最后一列,但事实可能并非如此,但我可以接受。我会对尝试在双引号中查找所有内容的解决方案感兴趣。我@我试试看,然后在这里发帖。
    • @MacUsers,请务必检查并让我知道您是否有任何其他条件,然后也可以编辑解决方案。
    【解决方案2】:

    sed 用于在单独的行上执行 s/old/new,仅此而已。使用 GNU awk 进行多字符 RS 和 RT:

    $ awk -v RS='"[^"]+"' -v ORS= '{gsub(/[\n"]/,"",RT); print $0 RT}' file
    138749,CJIKMN,d4IFtjCCBbIGCSqGSIb3DQEHAqCCBaMwggWfAgEDMQ0wCwYJYIZIAWUDBAIBMG4GBmeBCAEBAaBkBGIwYAIBADALBglghkgBZQMEAgEwTjAlAgEBBCAeyMDmgdZS30d5JSraWWoUX50J1vKONjxUYxK9iPZWWjAlAgECBCCzqs7CzH7+3j3trSz+/dcCmud3/Jo9ZYFmN4VTvTjB56CCBBowggQWMIIDnaADLp69+Z3QgAIgHOYjzAQlDRHnDJ/zDtlkWN5pq7T7h3ef9Mnv4ocSuAA=
    136065,CIJEPY,d4IF4jCCBd4GCSqGSIb3DQEHAqCCBc8wggXLAgEDMQ0wCwYJYIZIAWUDBAIBMIGYBgZngQgBAQGggY0EgYowgYcCAQAwCwYJYIZIAWUDBAIBMHUwJQIBAQQgNQdsXvKebYUdH0JybzpY2evf+v9Xg86bhkjOPQQDAjBBMQswCQYDVQQGEwJHQjEOMAwGA1UEChMFVUtLUEExIjAgBgNVBAMTGUNvdW50cnkgLUxRjUXbTgfGwUKOFwemsc4KXbsLZ13MkbNfAQ==
    

    【讨论】:

      【解决方案3】:

      试试这个 Perl 解决方案:

      $ cat mac.txt
      138749,CJIKMN,"d4IFtjCCBbIGCSqGSIb3DQEHAqCCBaMwggWfAgEDMQ0wCwYJYIZIAWUDBAIBMG4GBmeBCAEBAaBk
      BGIwYAIBADALBglghkgBZQMEAgEwTjAlAgEBBCAeyMDmgdZS30d5JSraWWoUX50J1vKONjxUYxK9
      iPZWWjAlAgECBCCzqs7CzH7+3j3trSz+/dcCmud3/Jo9ZYFmN4VTvTjB56CCBBowggQWMIIDnaAD
      Lp69+Z3QgAIgHOYjzAQlDRHnDJ/zDtlkWN5pq7T7h3ef9Mnv4ocSuAA="
      136065,CIJEPY,"d4IF4jCCBd4GCSqGSIb3DQEHAqCCBc8wggXLAgEDMQ0wCwYJYIZIAWUDBAIBMIGYBgZngQgBAQGg
      gY0EgYowgYcCAQAwCwYJYIZIAWUDBAIBMHUwJQIBAQQgNQdsXvKebYUdH0JybzpY2evf+v9Xg86b
      hkjOPQQDAjBBMQswCQYDVQQGEwJHQjEOMAwGA1UEChMFVUtLUEExIjAgBgNVBAMTGUNvdW50cnkg
      LUxRjUXbTgfGwUKOFwemsc4KXbsLZ13MkbNfAQ=="
      $ perl -ne ' chomp; if( /"$/) { s/\"//g;print $_,"\n" } else { s/\"//g; print } ' mac.txt  | nl
           1  138749,CJIKMN,d4IFtjCCBbIGCSqGSIb3DQEHAqCCBaMwggWfAgEDMQ0wCwYJYIZIAWUDBAIBMG4GBmeBCAEBAaBkBGIwYAIBADALBglghkgBZQMEAgEwTjAlAgEBBCAeyMDmgdZS30d5JSraWWoUX50J1vKONjxUYxK9iPZWWjAlAgECBCCzqs7CzH7+3j3trSz+/dcCmud3/Jo9ZYFmN4VTvTjB56CCBBowggQWMIIDnaADLp69+Z3QgAIgHOYjzAQlDRHnDJ/zDtlkWN5pq7T7h3ef9Mnv4ocSuAA=
           2  136065,CIJEPY,d4IF4jCCBd4GCSqGSIb3DQEHAqCCBc8wggXLAgEDMQ0wCwYJYIZIAWUDBAIBMIGYBgZngQgBAQGggY0EgYowgYcCAQAwCwYJYIZIAWUDBAIBMHUwJQIBAQQgNQdsXvKebYUdH0JybzpY2evf+v9Xg86bhkjOPQQDAjBBMQswCQYDVQQGEwJHQjEOMAwGA1UEChMFVUtLUEExIjAgBgNVBAMTGUNvdW50cnkgLUxRjUXbTgfGwUKOFwemsc4KXbsLZ13MkbNfAQ==
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多