1

以下の形式のデータがあります。

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

これを以下の形式に変換したいと思います。

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

これどうやってするの?

4

4 に答える 4

5

あなたが何を望んでいるのかははっきりしていません。ただし、このワンライナーはあなたの例でうまくいくはずです:

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

システムによっては、次のように sed 置換にリテラル改行を使用する必要がある場合があります。

tr -d '\n' < oldfile | sed 's/||/||\<RETURN>/g' > newfile
于 2012-08-10T22:16:53.310 に答える
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||
于 2012-08-12T14:45:52.120 に答える
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...
于 2012-08-13T17:11:11.983 に答える
1

一見すると、元の改行の代わりにスペースを使用して、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";
}

入力の行数が 3 の倍数でない場合、余分な行は省略されます。コードは各入力ファイルを個別に処理しません。それらをすべて組み合わせるだけです。指定された入力データの出力は次のとおりです。

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

これは正しいようです。

于 2012-08-10T23:25:53.177 に答える