在UNIX中格式化文件的问题

时间:2012-08-10 21:56:58

标签: unix unix-timestamp

我有以下格式的数据:

Pin|add
jtyjg
Kolk|aaa||
Kawr|wht u
Disnce
Djhdb|bbb||

我想将其转换为以下格式:

Pin|add jtyjg Kolk|aaa||
Kawr|wht u Disnce Djhdb|bbb||

我该怎么做?

4 个答案:

答案 0 :(得分:5)

目前还不是很清楚你想要什么。不过,这个单行应该是你的榜样:

tr -d '\n' < oldfile | sed 's/||/||\n/g' > newfile

根据您的系统,您可能需要使用文字换行符进行sed替换,如下所示:

tr -d '\n' < oldfile | sed 's/||/||\<RETURN>/g' > newfile

答案 1 :(得分:2)

试试这个..

<强> INPUT.TXT

Pin|add
jtyjg
Kolk|aaa||
Kawr|wht u
Disnce
Djhdb|bbb||

<强>代码

cat Input.txt | tr '\n' ' ' | sed 's/|| ./||~~/g' | tr '~~' '\n'| sed '/^$/d' > Output.txt

<强> Output.txt的

Pin|add jtyjg Kolk|aaa||
awr|wht u Disnce Djhdb|bbb||

答案 2 :(得分:2)

我假设原始文件在行尾字符之前没有空格......

这是相当基本的Perl,适用于v5.8.9

#!/usr/bin/perl

open( IN, '<', 'text.txt' );    # the input file
open( OUT, '>', 'text2.txt' );  # the output file

while( <IN> ) {
        chomp;          # get rid of the end-of-line characters
        $out .= $_;     # add the current input to the output string
        if ( /\|\|/ ) { # does this contain the output signal characters "||"?
                print( OUT "$out\n" );  # output the built string
                $out = '';              # clear the output string
        }
        else {
                $out = $out . ' ';      # append a space to the end
        }
}
print( OUT $out );                      # output anything left over...

答案 3 :(得分:1)

从表面上看,您希望将三个输入行组成一个组合,并用空格代替原始换行符。鉴于问题不限制工具集,那么Perl解决方案适度适用:

#!/usr/bin/env perl
use strict;
use warnings;

my($l1, $l2, $l3);
while (defined($l1 = <>) && defined($l2 = <>) && defined($l3 = <>))
{
    chomp($l1, $l2);
    print "$l1 $l2 $l3";
}

如果输入中的行数不是三的倍数,则省略额外的行。代码不单独处理每个输入文件;它只是将它们组合在一起。对于给定的输入数据,输出为:

Pin|add jtyjg Kolk|aaa||
Kawr|wht u Disnce Djhdb|bbb||

这似乎是正确的。