如何在linux中通过指定条件将文件中的两行合并为一行?

时间:2017-10-20 01:32:26

标签: linux awk sed

我有一个从mysql导出的文件,使用命令select into outfile转义为“\”...但是,某些字段中有换行导致断行,即mysql中的记录分为两行导出文件。仔细分析后,我发现断线以“\”结尾。所以我想将这样的行合并到下一行。我怎么能这样做?

示例输入:

hello
world\
Thank
you\
are
awesome

输出:

hello
worldThank
youare
awesome

文件有点大,可以是10 GB左右。

4 个答案:

答案 0 :(得分:2)

使用sed:

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

答案 1 :(得分:2)

使用awk

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

<强>解释

  • /\\$/使用\
  • 查找记录/行结尾
  • sub(/\\$/,"")替换,\为null
  • printf $0; next没有行分隔符的打印记录,转到下一行
  • }1 1在结尾处执行默认操作print $0,因此未跳过的行将按原样打印。

测试结果:

$ cat infile
hello
world\
Thank
you\
are
awesome

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

答案 2 :(得分:0)

你没有提供一个例子,但如果你有类似下面的内容,那么......它适用于GNU sed(我在OS X上)

Sub IndividualMacros()
    Dim i&, w As Range
    For Each w In ActiveDocument.Words
        If w.Text Like "*[A-Z,a-z]*" Then
            i = i + 1
            w.InsertBefore i & " "
        End If
    Next
End Sub

答案 3 :(得分: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)。因此,逻辑简化了删除换行符以及行尾的\