次のデータがあります(実際のデータには50,000桁と8000行を超える)。
入力する:
1 11122
1 21121
2 22221
2 11122
3 21121
3 11122
同じ名前の最初の行の値の横に2番目の行の値を配置したいと思います。また、各値ペア間の区切り文字としては2つのスペースが必要であり、異なる値ペア間の区切り記号としてタブが必要です。出力は次のようになります。
出力:
1 1 2 1 1 1 1 2 2 2 1
2 2 1 2 1 2 1 2 2 1 2
3 2 1 1 1 1 1 2 2 1 2
どんな提案がありますか?
ベストアンサー1
私はPerlを使い、次のようにonelinerとして実行します。
perl -wne 'sub parseline { ($id,$v) = split; return split //,$v };
@a = parseline();
print "$id\t";
$_ = <>;
@b = parseline();
for ($i=0; $i<@a; $i++) {
print "$a[$i] $b[$i]\t"
};
print "\n"' < input > output
説明する:
perl -wne
各入力行に対して残りのコマンドを実行します。sub parseline { .... }
入力を解析し、行の最初の数字を設定$id
し、残りは文字配列として返します。@a=parseline()
文字の最初の行は @a 配列に格納されます。- 次に印刷
$id
してTAB(\t
)を押します。 $_=<>; @b=parseline();
次の(偶数)行を読み、そのデータを配列に入れます。@b
for ($i=0; $i<@a; $i++) { print "$a[$i] $b[$i]\t" }
配列の各要素に対して、@a
要素、2つのスペース、配列の対応する要素を印刷してから、タブを@b
印刷します。print "\n"
最後に改行文字を印刷します- at startパラメーターのため、
-n
プロセス全体は3行、5行、7行の順に始まります。perl
< input > output
入力を読み取るファイルと出力を書き込むファイルを示します。
注:コードは各行の末尾に追加のタブを印刷します。クラウドソーシングを防ぎ、コードをより簡単に保つための読者の練習でこれを削除しました。また、コードでは、ペアの行が常に2つの行が順番に連続していると想定しています(例を参照)。
入力ファイルを1行ずつ処理するため、数千行にわたって簡単に線形に拡張できます。