无法删除双引号

时间:2017-09-23 10:46:57

标签: perl awk sed gawk tr

我想删除列数据中任何不可打印的新行字符。

我用双引号括起所有列,以便轻松删除列中的新行字符,并在每行结束后忽略记录分隔符。

说,我有4个用逗号分隔的列,并用文本文件中的引号括起来。 我试图删除\ n和\ r \ n字符只有在双引号之间存在

目前使用的修剪,但它删除了每个换行符并使其成为一个没有任何记录分隔符的序列文件。

tr -d '\n\r' < in.txt > out.txt

示例数据:

  

&#34; 1&#34;&#34;测试\ n

     

样品&#34;&#34;数据&#34;&#34; COL4&#34; \ n

     

&#34; 2 \ n

     

&#34;&#34;试验&#34;&#34;样品&#34;&#34;数据&#34; \ n

     

&#34; 3&#34;&#34;萨姆\ n

     

PLE&#34;&#34; TE \ n

     

ST&#34;&#34;数据&#34; \ n

预期输出:

  

&#34; 1&#34;&#34; testSample&#34;&#34;数据&#34;&#34; COL4&#34; \ n

     

&#34; 2&#34;&#34;试验&#34;&#34;样品&#34;&#34;数据&#34; \ n

     

&#34; 3&#34;&#34;样品&#34;&#34;测试&#34;&#34;数据&#34; \ n

有什么建议吗?提前致谢

3 个答案:

答案 0 :(得分:0)

使用GNU sed

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

如果没有封闭的",请参阅this post换行换代。

答案 1 :(得分:0)

你可以试试awk解决方案,让我知道这是否对你有帮助。

awk '{gsub(/\r/,"");printf("%s%s",$0,$0~/,$/?"":RS)}'  Input_file

输出如下。

"1","test","Sample","data"\n
"2","Test" \n
"3","Sample"

说明:使用printf打印线条,因此在此处使用2%s(用于在printf中打印字符串),首先%s只打印当前行,第二行将检查行是否以逗号(,)结束,如果是,则它将不会打印任何其他内容,它将打印一个新行。在printf之前添加gsub(/\r/,""),以防您想要删除回车并希望获得您显示的预期输出。

编辑:由于您的帖子标题建议删除回车符,因此如果您想要删除回车符,则可以尝试按照。虽然你应该清楚地提到你的问题。

tr -d '\r' < Input_file > temp_file && mv temp_file  Input_file

上面将从Input_file中删除托架字符并将其保存在相同的Input_file中。

答案 2 :(得分:0)

这是一个可能的解决方案:

perl -pe 'if (tr/"// % 2) { chomp; $_ .= <>; redo; }'

如果当前行有不平衡的引号(即奇数"),它必须在字段的中间结束,所以我们选择换行,附加下一个输入行,然后重新启动循环