2017-10-20 214 views
0

我有一个文件,它从mysql中使用命令select导出到outfile由“\”转义的输出...但是,有些字段中会出现换行符,导致出现断行,即mysql中的记录被分成导出的两行文件。经过仔细分析,我发现破裂的线以“\”结尾。所以我想把这样的线条合并到下一行。我怎样才能做到这一点?如何通过linux中的指定条件将文件中的两行合并为一行?

例如输入:

hello 
world\ 
Thank 
you\ 
are 
awesome 

输出:

hello 
worldThank 
youare 
awesome 

该文件是一个有点大,其可以是10 GB左右。

+0

您能否提供输入示例和所需输出吗? –

回答

2

使用sed:

sed 'N;s/\\\n//;P;D;' file 
0

您没有提供一个例子,但如果你有类似以下内容,然后......它工作在GNU sed的(我在OS X)

$ cat /tmp/sql 
select * from usr \ 
join org on usr.org_id = org.org_id \ 
where usr_id = 'xyz' 

$ sed -z 's/\\\n//g' 
select * from usr join org on usr.org_id = org.org_id where usr_id = 'xyz' 
+0

但是gsed不是centos7中的内置命令......而且当文件足够大时,cat命令可能不是一个好主意。 – xunyl

+0

改为使用'sed',在linux上它是GNU。 “cat”和大文件有什么问题?虽然这是一个不同的问题:) –

+0

如果文件足够大,主机不能分配大内存。 – xunyl

2

使用awk

awk '/\\$/{sub(/\\$/,"");printf $0; next}1' infile 

说明:

  • /\\$/外观备案/符合\
  • sub(/\\$/,"")替代品,\与空
  • printf $0; next打印记录结束而没有行分隔符,并转到下一行
  • }11在最后会执行默认操作print $0,所以没有跳过的行将被打印。

试验结果:

$ cat infile 
hello 
world\ 
Thank 
you\ 
are 
awesome 

$ awk '/\\$/{sub(/\\$/,"");printf $0; next}1' infile 
hello 
worldThank 
youare 
awesome 
0

另一个使用awk通过操纵输出记录分隔符

$ awk '{ORS = sub(/\\$/,"") ? "" : "\n"} 1' ip.txt 
hello 
worldThank 
youare 
awesome 

清除ORS如果置换成功其他分配(在线路的端部去除\)通常换行符


使用GNU awk,只需使用\后跟换行符作为记录分隔符。而空字符串作为ORS因为这些字符必须是刚删除

$ gawk -v RS='\\\\\n' -v ORS= '1' ip.txt 
hello 
worldThank 
youare 
awesome 


从输入线perl

$ perl -pe 's/\\\n//' ip.txt 
hello 
worldThank 
youare 
awesome 

换行符像sed/awk不会被删除(需要选项-l)。所以逻辑简化为删除换行符\在行尾

相关问题