如何将 2 行合并为一行

如何将 2 行合并为一行

我有如下记录

"1234", "abcg"
"456899","jklm
sd"
"34566","lmno"

我想在同一行中继续第二条记录,因此输出将是

"1234", "abcg"
"456899","jklmsd"
"34566","lmno"

要点是我想继续第二行而不是将其分成两行

答案1

尝试这个,

awk '/^"/{printf "\n";} {printf "%s",$0}' test.csv

"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
  • /^"/{printf "\n";}如果行以双引号开头,将添加一个新行。
  • {printf "%s",$0}将删除每行中的新行。

答案2

awk方法由于其简单性而效果良好。但也可以使用流编辑器sed跨多行工作,如中所暗示的这个答案。该技术在其他情况下可能有用。

sed -r ':a;N;$!ba;s/\n([^, "]+\"\n)/\1/g' file

Sed 有一个简洁的命令语法。这是做什么的

  1. 用于:a创建标签,
  2. N命令附加下一行,
  3. 分支到我们的标签$!ba
  4. s替换之间的文本/\n(...)/
  5. 第一个新行\n位于括号之外,因此被删除。
  6. /\1/只是放回括号内的内容。

[^, "] regex模式是对查找不完整字段的快速猜测。它查找不带逗号或空格且以引号结尾的行,并将它们附加到上一行。该文件可能存在其他不一致之处,像这样的简单模式无法修复。

结果:

"1234", "abcg"
"456899","jklmsd"
"34566","lmno"

答案3

csvjson下面的代码使用from删除了 CSV 数据第二列中所有嵌入的换行符csvkit将数据转换为 JSON,然后jq查找并替换所有换行符,并将数据重新格式化为 CSV。

$ csvjson -H file.csv | jq -r '.[] | .b |= gsub("\n"; "") | [ .a, .b ] | @csv'
1234," ""abcg"""
456899,"jklmsd"
34566,"lmno"

看起来很时髦" ""abcg"""是由于原始数据嵌入了双引号(它们嵌入在数据中,而不是由于字段中第一个双引号之前的空格而引用字段)。

选项-H告诉csvjson工具第一行不是标题行而是数据。该jq表达式对每行上的两个字段使用.a和。.b

答案4

要修复下一行有记录的 csv,您可以使用sed编辑器:

$ sed -e '
    $!N
    /\n"/!s/\n//
    P;D
' file.csv

解释:

  • 任何不以双引号开头的行都会溢出,因此我们继续删除换行符,以便它与上一行合并。
  • P;Dpragma 将重复这个过程直到 eof。
  • 我们通过命令将 csv 文件的 2 行检查到模式空间中$!N

awk我们可以根据输入行操作输出记录分隔符并获得所需的输出:

$ awk '{ORS = /"$/ ? RS : ""}1' file.csv

相关内容