以下の形式のデータがあります。
Pin|add
jtyjg
Kolk|aaa||
Kawr|wht u
Disnce
Djhdb|bbb||
これを以下の形式に変換したいと思います。
Pin|add jtyjg Kolk|aaa||
Kawr|wht u Disnce Djhdb|bbb||
これどうやってするの?
以下の形式のデータがあります。
Pin|add
jtyjg
Kolk|aaa||
Kawr|wht u
Disnce
Djhdb|bbb||
これを以下の形式に変換したいと思います。
Pin|add jtyjg Kolk|aaa||
Kawr|wht u Disnce Djhdb|bbb||
これどうやってするの?
あなたが何を望んでいるのかははっきりしていません。ただし、このワンライナーはあなたの例でうまくいくはずです:
tr -d '\n' < oldfile | sed 's/||/||\n/g' > newfile
システムによっては、次のように sed 置換にリテラル改行を使用する必要がある場合があります。
tr -d '\n' < oldfile | sed 's/||/||\<RETURN>/g' > newfile
これを試して..
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||
元のファイルの行末文字の前に空白がないことを前提としています...
これはかなり基本的な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";
}
入力の行数が 3 の倍数でない場合、余分な行は省略されます。コードは各入力ファイルを個別に処理しません。それらをすべて組み合わせるだけです。指定された入力データの出力は次のとおりです。
Pin|add jtyjg Kolk|aaa||
Kawr|wht u Disnce Djhdb|bbb||
これは正しいようです。