Как объединить многострочную строку в шаблоне (но исключая шаблон)? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть 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.

-San

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

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==
0 голосов
/ 12 декабря 2018

Попробуйте это решение 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==
$
0 голосов
/ 11 декабря 2018

Не могли бы вы попробовать следующее (добавим объяснение в ближайшее время).

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.
...