4

ID と値を持つ 3 つのファイルがあります。

sdt5z@fir-s:~/test$ ls
a.txt  b.txt  c.txt
sdt5z@fir-s:~/test$ cat a.txt 
id1 1
id2 2
id3 3
sdt5z@fir-s:~/test$ cat b.txt 
id1 4
id2 5
id3 6
sdt5z@fir-s:~/test$ cat c.txt 
id1 7
id2 8
id3 9

このようなファイルを作成したいのですが...

id1 1 4 7
id2 2 5 8
id3 3 6 9

...できれば単一のコマンドを使用します。

結合コマンドと貼り付けコマンドを認識しています。貼り付けは毎回 id 列を複製します:

sdt5z@fir-s:~/test$ paste a.txt b.txt c.txt 
id1 1   id1 4   id1 7
id2 2   id2 5   id2 8
id3 3   id3 6   id3 9

結合はうまく機能しますが、一度に 2 つのファイルのみです。

sdt5z@fir-s:~/test$ join a.txt b.txt 
id1 1 4
id2 2 5
id3 3 6
sdt5z@fir-s:~/test$ join a.txt b.txt c.txt 
join: extra operand `c.txt'
Try `join --help' for more information.

また、「-」を使用することで、paste が STDIN を引数の 1 つとして使用できることも認識しています。たとえば、次を使用して join コマンドを複製できます。

sdt5z@fir-s:~/test$ cut -f2 b.txt | paste a.txt -
id1 1   4
id2 2   5
id3 3   6

しかし、これを 3 つのファイルに対応するように変更する方法がまだわかりません。

私はこれを perl スクリプト内で行っているので、これを foreach ループ内に入れるようなことができることを知っています。たとえば、join file1 file2 > tmp1、join tmp1 file3 > tmp2 などです。ワンライナーでこれを行うには。

4

4 に答える 4

12

join a.txt b.txt|join - c.txt

十分なはずです

于 2012-02-09T14:49:22.623 に答える
1

Perl スクリプト内で実行しているため、シェルで生成するのではなく、Perl で作業を行っていない特定の理由はありますか?

次のようなもの (テストされていません! emptor の警告):

use File::Slurp; # Slurp the files in if they aren't too big
my @files = qw(a.txt b.txt c.txt);
my %file_data = map ($_ => [ read_file($_) ] ) @files;
my @id_orders;
my %data = ();
my $first_file = 1;
foreach my $file (@files) {
    foreach my $line (@{ $file_data{$file} }) {
        my ($id, $value) = split(/\s+/, $line);
        push @id_orders, $id if $first_file;
        $data{$id} ||= [];
        push @{ $data{$id} }, $value;
    }
    $first_file = 0;
}
foreach my $id (@id_orders) {
    print "$d " . join(" ", @{ $data{$id} }) . "\n";
}
于 2012-02-09T14:50:38.753 に答える
0
pr -m -t -s\  file1.txt file2.txt|gawk '{print $1"\t"$2"\t"$3"\t"$4}'> finalfile.txt

file1 と file2 には 2 つの列があり、1 と 2 は file1 の列を表し、3 と 4 は file2 の列を表すとします。

この方法で各ファイルから任意の列を印刷することもでき、入力として任意の数のファイルを使用できます。たとえば、file1 に 5 つの列がある場合、$6 が file2 の最初の列になります。

于 2013-04-16T09:03:04.800 に答える
0

perl -lanE'$h{$F[0]} .= " $F[1]" END{say $_.$h{$_} foreach keys %h}' *.txt

動作するはずですが、携帯電話から応答しているためテストできません。sortと の間foreachにを入れると、出力をソートすることもできますkeys

于 2012-02-09T16:33:13.850 に答える