我的输入文件中还有其他换行符。以下是我的文件示例。请帮忙。
H|20140705|5.dat
D|40904515|10013660|2|Trading Inc|1
D|40904517|10013685|2|trillion@trillionsales.com
info@trillionsales.com|3
D|40904518|10013719|2|Yearnlink Limited|1
D|40904519|10013722|2|Pine Tree Limited|1
T|004|19655819|20140705
如果您注意到,字段中似乎有一个额外的换行符,其值为tssson@tsas.com
info@trddd.com
。
我需要用空格替换这个换行符。记录应仅以 - H|
,D|
或T|
我找到了以下命令,该命令删除了任何不以引号开头的记录的换行符。但是,我需要删除不以H|
,D|
或T|
开头的任何记录的换行符。
我无法修改下面的命令,因为它不采用例如'H |' (它只考虑第一个字符)。
sed -e :a -e '$!N; s/ *\n\([^"]\)/ \1/; ta' -e 'P;D' file
答案 0 :(得分:2)
让我们保留一行打印缓冲区:
$ awk '/^[HDT]/ {if (buff) print buff; buff=$0; next} {buff=buff""FS""$0} END{print buff}' file
H|20140705|5.dat
D|40904515|10013660|2|Trading Inc|1
D|40904517|10013685|2|trillion@trillionsales.com info@trillionsales.com|3
D|40904518|10013719|2|Yearnlink Limited|1
D|40904519|10013722|2|Pine Tree Limited|1
T|004|19655819|20140705
/^[HDT]/ {if (buff) print buff; buff=$0; next}
如果行以H,D或T开头,请执行{}
。if (buff) print buff; buff=$0; next
如果缓冲区包含数据,则打印它。然后,将当前行存储在缓冲区中,并使用next
转到下一行。{buff=buff""FS""$0}
如果该行不以H / D / T开头,请将其内容附加到缓冲区。END{print buff}
在处理完文件后打印缓冲区。这样做是为了打印最后存储的缓冲区,即从H / D / T(包括)开始的最后一行的所有内容。答案 1 :(得分:0)
您可以使用此sed
,
sed ':a; N; /\n[HDT]/!s/\n//g; t a;' yourfile
下面,
N
将读取下一行并将其附加到包含\n
分隔符的现有行/\n[HDT]/!
如果下一行不是以H
或D
或T
s/\n//g
删除新行。<强>测试强>
$ sed ':a; N; /\n[HDT]/!s/\n//g; t a;' yourfile
H|20140705|5.dat
D|40904515|10013660|2|Trading Inc|1
D|40904517|10013685|2|trillion@trillionsales.cominfo@trillionsales.com|3
D|40904518|10013719|2|Yearnlink Limited|1
D|40904519|10013722|2|Pine Tree Limited|1
T|004|19655819|20140705