我有如下记录
"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 有一个简洁的命令语法。这是做什么的
- 用于
:a
创建标签, - 该
N
命令附加下一行, - 分支到我们的标签
$!ba
, - 并
s
替换之间的文本/\n(...)/
- 第一个新行
\n
位于括号之外,因此被删除。 /\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;D
pragma 将重复这个过程直到 eof。- 我们通过命令将 csv 文件的 2 行检查到模式空间中
$!N
。
awk
我们可以根据输入行操作输出记录分隔符并获得所需的输出:
$ awk '{ORS = /"$/ ? RS : ""}1' file.csv