Unix文件中的换行符

时间:2016-10-27 09:08:36

标签: linux file awk sed

我有一个文件,其中的记录由|分隔。有一些换行符,第一行的一部分移动到第二行。如果我计算|的数量在特定的一行中,它应该始终如一。如何识别哪一行具有换行符并将两行附加到一行中,以及' |'每一行都是一致的吗?

该文件如下所示:

java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver

而我想计算' |'在每一行。

在这种情况下,每行应该有3' |'每个,但由于换行,情况并非如此,

我最终的期望输出是

DeptID|EmpFName|EmpLName|Salary
Engg|Sam|Le
wis|1000
Engg|Smith|Davis|2000
HR|Denis
|Lillie|1500
HR|Danny|Borr
inson|3000
IT|David|Letterman|2000
IT|John|Newman|3000

2 个答案:

答案 0 :(得分:0)

鉴于最大分割是由所讨论的OP所述的两行,sed可以用于一个简单的解决方案

$ cat ip.txt 
DeptID|EmpFName|EmpLName|Salary
Engg|Sam|Le
wis|1000
Engg|Smith|Davis|2000
HR|Denis
|Lillie|1500
HR|Danny|Borr
inson|3000
IT|David|Letterman|2000
IT|John|Newman|3000

$ sed '/.*|.*|.*|/! {N; s/\n//}' ip.txt 
DeptID|EmpFName|EmpLName|Salary
Engg|Sam|Lewis|1000
Engg|Smith|Davis|2000
HR|Denis|Lillie|1500
HR|Danny|Borrinson|3000
IT|David|Letterman|2000
IT|John|Newman|3000
  • /.*|.*|.*|/!如果行不包含三个|
    • {N; s/\n//}获取下一行并删除第一个\n


使用分组和量词来指定数字

sed '/\(.*|\)\{3\}/! {N; s/\n//}' ip.txt

使用扩展正则表达式-E-r

sed -E '/(.*\|){3}/! {N; s/\n//}' ip.txt

答案 1 :(得分:0)

一个在awk中:

$ cat foo.awk
BEGIN { FS=OFS="|" }  # set separators
NR==1 { nf=NF }       # expect the field count to be correct on header record
NF<nf {               # if NF less than on header record
    while (NF<nf) {   # and while NF < less than on header record
        b=$0          # buffer too short record
        getline       # read next record
        $0 = b $0     # catenate buffer and fresh record
    }
} 1                   # output

运行它:

$ awk -f foo.awk foo
DeptID|EmpFName|EmpLName|Salary
Engg|Sam|Lewis|1000
Engg|Smith|Davis|2000
HR|Denis|Lillie|1500
HR|Danny|Borrinson|3000
IT|David|Letterman|2000
IT|John|Newman|3000

不检查记录是否增长太长。