如何使用sed或awk重新格式化csv文件的单个列

如何使用sed或awk重新格式化csv文件的单个列,csv,awk,sed,Csv,Awk,Sed,如何使用awk或sed重新格式化单个列 目前,我得到以下输出: "11002","","","None","172.16.10.1","udp","53","DNS Server Detection","A DNS server is listening on the remote host.","The remote service is a Domain Name System (DNS) server, which provides a mapping between hostnames

如何使用awk或sed重新格式化单个列

目前,我得到以下输出:

"11002","","","None","172.16.10.1","udp","53","DNS Server Detection","A DNS server is listening on the remote host.","The remote service is a Domain Name System (DNS) server, which
provides a mapping between hostnames and IP addresses.","Disable this service if it is not needed or restrict access to
internal hosts only if the service is available externally.","http://en.wikipedia.org/wiki/Domain_Name_System",""
但是我想把整个输出放在一行中:

"11","","","No","10.1.1.1","udp","53","DNS","A DNS ","remote IP","Disable","Domain_Name_System",""

通常,awk和sed都不适合处理CSV文件。当然,您可能很幸运,但在您的武库中添加CSV感知工具可能是值得的。如果你不想依赖电子表格程序,你可以做得比依赖csv2tsv | MUNGE | tsv2csv总结的策略更糟糕

事实上,有一些名为csv2tsv和tsv2csv的命令行工具可以免费使用,一些perlsv解析解决方案是众所周知的。PHP有一个非常方便的函数fgetcsv,很容易编写一个围绕它的包装器。

这可能适合您(GNU-sed):


这将删除双引号之间的换行符。然而,解决方案很脆弱,不能满足双引号的要求。

这似乎可以归结为找到一种可能,来区分文本列中的换行符和真正标记CSV行结束的换行符。 您特别要求
awk
sed
。但由于这意味着您很可能也有可用的
tr
,请尝试以下方法:

cat your.csv | sed 's/"$/"#/' | tr "\n" " " | tr "#" "\n" 

我假设
作为行上的最后一个字符可能是CSV行最后一个字段的结束引号。如果您有空格,您可以在
sed的/*$/'
中插入一个
。此外,我假设您的文件中没有任何
字符,因为我使用它来标记“real”“行尾。如果不是这样的话,您必须找到另一个未使用的字符

您能否澄清初始输出是如何转化为所需输出的?规则是什么?
cat your.csv | sed 's/"$/"#/' | tr "\n" " " | tr "#" "\n"