我有一个文件,其中的记录由|分隔。有一些换行符,第一行的一部分移动到第二行。如果我计算|的数量在特定的一行中,它应该始终如一。如何识别哪一行具有换行符并将两行附加到一行中,以及' |'每一行都是一致的吗?
该文件如下所示:
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
答案 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
不检查记录是否增长太长。