想象一下输入是:
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8
",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code
我想要 3 行(例如换行符为 ####):
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code
谢谢,伊曼纽尔
答案1
awk
解决方案:
awk -F',' '{ printf "%s%s", $0, ($NF ~ /^".+[^"]$/? "####" : ORS) }' file
输出:
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code
答案2
sed -r ':x /$/ { N; s/\r?\n\s*"/####"/; bx}' inputfile
\r?
使其适用于 Linux 和 Windows 文本文件
答案3
数据被适当引用,并且应该可以被任何支持 CSV 的解析器读取。
要删除无标头 CSV 文件的第 5 个字段中可能出现的换行符,您可以使用磨坊主( mlr
) 像这样:
$ mlr --csv -N put '$5 = sub($5,"\n","")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,1GH8,KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code
这通过使用替换第一个换行符来重写第五个字段sub()
(即删除它)。
####
也可以将换行符替换为:
$ mlr --csv -N put '$5 = sub($5,"\n","####")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,1GH8####,KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code
请注意,结果字段不需要引号,这就是 Miller 默认不添加引号的原因。如果您想保留原始引号,请使用--quote-original
:
$ mlr --csv -N --quote-original put '$5 = sub($5,"\n","####")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code
用于-I
执行“就地”编辑。