使用sed,tr,...来修复文件的结构

时间:2014-08-18 23:27:52

标签: linux bash sed terminal tr

我的文件的行应该是

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的文件需要修复。

1 个答案:

答案 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,但很棘手。