您好我在这里编辑我的问题,要求略有变化,其中CSV文件只有LF开头。但是,CSV文件也可以在双引号内的元素之间使用LF。我们希望将LF保留在双引号内,并用CRLF替换该行末尾的LF。 所以,如果我的源文件如下所示:
enter code here
Date,Open,High,Low,Close,comments,Remark
5-Dec-16,8088.75,8141.9,8056.85,8128.75,"TEST1 <LF>
TEST2 <LF>
with NL",remark<LF>
6-Dec-16,8153.15,8178.7,8130.85,8143.15,AAAA,remark<LF>
7-Dec-16,8168.4,8190.45,8077.5,8102.05,BBBB,remark<LF>
8-Dec-16,8152.1,8256.25,8151.75,8246.85,"TEST1<LF>
TEST with NL",remark<LF>
9-Dec-16,8271.7,8274.95,8241.95,8261.75,CCCC,remark<LF>
Date,Open,High,Low,Close,comments,Remark
5-Dec-16,8088.75,8141.9,8056.85,8128.75,"TEST1 <LF>
TEST2 <LF>
with NL",remark<CRLF>
6-Dec-16,8153.15,8178.7,8130.85,8143.15,AAAA,remark<CRLF>
7-Dec-16,8168.4,8190.45,8077.5,8102.05,BBBB,remark<CRLF>
8-Dec-16,8152.1,8256.25,8151.75,8246.85,"TEST1<LF>
TEST2 with NL",remark<CRLF>
9-Dec-16,8271.7,8274.95,8241.95,8261.75,CCCC,remark<CRLF>
enter code here
感谢您的帮助。
谢谢, CHANDAN
答案 0 :(得分:1)
最好使用适当的CSV解析器来处理引用字段中的换行符。 Perl有一个:
perl -MText::CSV -e '
$csv = Text::CSV->new({ binary => 1 });
while ($row = $csv->getline(STDIN)) {
$row = [map {s/\n+/ /g; $_} @$row];
$csv->say(STDOUT, $row)
}
' < file.csv
或ruby
ruby -rcsv -e '
CSV.parse( readlines.join "" ).each {|row|
puts CSV.generate_line( row.collect {|elem| elem.gsub /\n+/, " "} )
}
' file
答案 1 :(得分:0)
如果您想控制M个字符,那么以下内容可能对您有帮助。
tr -d '\r' < Input_file
如果你想删除控制M字符并保存到Input_file本身,那么以下内容可能有所帮助。
tr -d '\r' < Input_file > temp_file && mv temp_file Input_file
答案 2 :(得分:0)
您正在寻找机会:
awk -v RS='\r\n' '{gsub(/[\r\n]+/," ")}1' file
但没有关于\r
和\n
在您的输入中出现的详细信息的详细信息。以上使用GNU awk进行多字符RS,除了用空格替换每个字段内的回车链和/或换行链外,还会将换行符从\r\n
(Windows样式)转换为\n
(UNIX风格),从那时起,它可以更容易地用它们做任何其他事情。
另请参阅What's the most robust way to efficiently parse CSV using awk?了解如何使用awk处理CSV。
答案 3 :(得分:0)
awk中的一个小状态机:使用双引号作为字段分隔符,并根据字段数量进行操作:
awk -F '"' '
partial {$0 = partial OFS $0; partial = ""}
NF % 2 == 0 {partial = $0; next}
{print}
' file