我的文件的行应该是
U:<text>\tD:<text>\tA:<text>\n
其中&lt;文字&gt;是一些没有制表符或换行符的文本。 \ t是tab,\ n是换行符。不幸的是有些&lt;文字&gt;字段包含换行符,因此结构被破坏。例如:
U:uuu D:ddd A:aaa
U:uuu D:ddd A:aaa
U:uu
u D:ddd A:aaa
U:uuu D:ddd A:aaa
这里第3行的字段U中有换行符,导致第3行中的某些内容现在位于第4行。如何使用sed或tr等工具修复结构?我想删除那些不在我记录末尾的换行符。
例如,上面的固定文件应如下所示:
U:uuu D:ddd A:aaa
U:uuu D:ddd A:aaa
U:uuu D:ddd A:aaa
U:uuu D:ddd A:aaa
该解决方案的另一个重要方面是速度,因为我有数GB的文件需要修复。
答案 0 :(得分:2)
给定输入数据(保存在文件data
中):
U:uuu D:ddd A:aaa1
U:uuu D:ddd A:aaa2
U:uu
u D:ddd A:aaa3
U:uuu D:ddd A:aaa4
U:uuu D:dd
d A:aaa5
U:uuu D:ddd A:aaa6
sed
脚本(保存在文件sed.script
中):
/^U:.* D:.* A:.*/ { p; d; }
/^U:.* D:.*/ { N; s/\n *//; p; d; }
/^U:.*/ { N; s/\n *//; p; d; }
可以运行并产生显示的输出:
$ sed -f sed.script data
U:uuu D:ddd A:aaa1
U:uuu D:ddd A:aaa2
U:uuu D:ddd A:aaa3
U:uuu D:ddd A:aaa4
U:uuu D:ddd A:aaa5
U:uuu D:ddd A:aaa6
$
脚本的第一行在一行中查找U:
,D:
和A:
,假定它已完成(而不是损坏的A:
文本字段)并打印该行并删除它(跳过脚本中的其他操作)。第二行仅查找U:
和D:
; A:
大概是在下一行。它附加下一行输入,删除嵌入的换行符和后面的空格(如果有的话),然后像以前一样打印和删除。第三行仅查找U:
,并假设D:
和A:
都在下一行。它附加下一行,删除嵌入的换行符和后面的空格(如果有的话),然后像以前一样打印和删除。
将其扩展为处理A:
文本字段中的中断将是非常重要的。将其扩展到处理也是非常重要的:
U:uu
u D:dd
d A:aaa7
两者都不是正式不可能的(特别是如果您选择使用Perl或Python而不是sed
),但并非完全简单。双拆分更容易处理;在第三行内,您将根据是否找到A:
等进行第二组条件操作。
处理单个字段的多个拆分:
U:u
u
u
D:d
d
d
A:aaa
也很棘手 - 可能是可行的,即使在sed
,但很棘手。