0

私は2つのファイルを持っています。

たとえば、ファイル #1 の内容は次のとおりです。

dynSamp/dgenExp
dynSamp/dgenLod
dynSamp/dgenStm
dynSamp/dgenUpd
dynSamp/dmlnodExp
dynSamp/dmlnodLod
dynSamp/dmlnodStm
dynSamp/dmlnodUpd
dynSamp/dmndynLod
dynSam/dmndynStm
dynSamp/dmndynUpd
sample/genExp
sample/genLod
sample/genStm
sample/genUpd
sample/mlnodExp
sample/mlnodLod
sample/mlnodStm
sample/mlnodUpd
sample/mndynLod
sample/mndynStm
sample/mndynUpd
sample/genLod
dynSamp/dgenLod
dynSamp/dmlnodLod
dynSamp/dmndynLod
sample/mndynLod
sample/mlnodLod

ファイル #2 の内容は次のとおりです。

dynSamp/dgenExp
dynSamp/dgenLod
dynSamp/dgenStm
dynSamp/dgenUpd
dynSamp/dmlnodStm
dynSamp/dmndynStm
dynSamp/dthrdsUpd_unix
dynSamp/dthrdsUpd_win
sample/genExp
sample/genLod
sample/genStm
sample/genUpd
sample/mlnodStm
sample/mndynStm
sample/thrdsUpd_unix
sample/thrdsUpd_win
sample/genLod
dynSamp/dgenLod
dynSamp/dmndynStm
dynSamp/dthrdsUpd_win

この2つのファイルを整理したいと思います。結果は、最初のファイルの一意の内容から、2 番目のファイルの一意/重複した内容を差し引いたものになります。

ファイル # に残っているのは次のとおりです。

dynSamp/dmlnodExp
dynSamp/dmlnodLod
dynSamp/dmlnodUpd
dynSamp/dmndynLod
dynSamp/dmndynUpd
sample/mlnodExp
sample/mlnodLod
sample/mlnodUpd
sample/mndynLod
sample/mndynUpd

誰でもこれを整理するのを手伝ってもらえますか? ありがとう!

4

3 に答える 3

3

あなたは何も質問しなかったので、アルゴリズムを考え出すのに問題があると思います。ここに1つあります:

  1. 2 番目のファイルを開きます。
  2. 2 番目のファイルの各行について、
    1. その行をキーとするハッシュに要素を作成します。
  3. 最初のファイルを開きます。
  4. 最初のファイルの各行について、
    1. ハッシュにその行をキーとする要素がない場合、
      1. その行をキーとするハッシュに要素を作成します。
      2. その行を印刷します。

このアルゴリズムは、最初のファイルのレコードの順序を保持します。


それをコーディングするのはかなり簡単なので、それも提供したほうがよいでしょう。

my %skip;
{
   open(my $fh, '<', $ARGV[1])
      or die("Can't open \"$ARGV[1]\": $!\n");
   while (<$fh>) {
      chomp;
      ++$skip{$_};
   }
}

{
   open(my $fh, '<', $ARGV[0])
      or die("Can't open \"$ARGV[0]\": $!\n");
   while (<$fh>) {
      chomp;
      print "$_\n" if !$skip{$_}++;
   }
}

使用法:

script file1 file2 >file.out

または並べ替え:

script file1 file2 | sort >file.out
于 2013-02-18T08:02:26.327 に答える
0

私はあなたがこのようなものが欲しいと思う...

dogface@computer ~
$ cat sortit.pl
#!/usr/bin/perl -w
use strict;


my $file1 = 'file1';
my $file2 = 'file2';

my %bad;
my %good;

open BAD, "<$file2";
while (<BAD>) {
        chomp;
        $bad{$_} = 1;
}
close BAD;

open GOOD, "<file1";
while( <GOOD> ) {
        chomp;
        next if $bad{$_};
        $good{$_} = 1;
}
close GOOD;

open OUT, ">file3";
foreach my $key ( keys %good ) {
        print OUT $key . "\n";
}
close OUT;

dogface@computer ~
$ cat file1
dynSamp/dgenExp
dynSamp/dgenLod
dynSamp/dgenStm
dynSamp/dgenUpd
dynSamp/dmlnodExp
dynSamp/dmlnodLod
dynSamp/dmlnodStm
dynSamp/dmlnodUpd
dynSamp/dmndynLod
dynSam/dmndynStm
dynSamp/dmndynUpd
sample/genExp
sample/genLod
sample/genStm
sample/genUpd
sample/mlnodExp
sample/mlnodLod
sample/mlnodStm
sample/mlnodUpd
sample/mndynLod
sample/mndynStm
sample/mndynUpd
sample/genLod
dynSamp/dgenLod
dynSamp/dmlnodLod
dynSamp/dmndynLod
sample/mndynLod
sample/mlnodLod

dogface@computer ~
$ cat file2
dynSamp/dgenExp
dynSamp/dgenLod
dynSamp/dgenStm
dynSamp/dgenUpd
dynSamp/dmlnodStm
dynSamp/dmndynStm
dynSamp/dthrdsUpd_unix
dynSamp/dthrdsUpd_win
sample/genExp
sample/genLod
sample/genStm
sample/genUpd
sample/mlnodStm
sample/mndynStm
sample/thrdsUpd_unix
sample/thrdsUpd_win
sample/genLod
dynSamp/dgenLod
dynSamp/dmndynStm
dynSamp/dthrdsUpd_win

dogface@computer ~
$ ./sortit.pl

dogface@computer ~
$ cat file3
sample/mndynLod
dynSamp/dmlnodUpd
dynSamp/dmlnodLod
dynSamp/dmlnodExp
sample/mndynUpd
sample/mlnodUpd
sample/mlnodLod
dynSamp/dmndynLod
dynSamp/dmndynUpd
sample/mlnodExp
dynSam/dmndynStm

dogface@computer ~
$

ああ、file3 をソートしたい場合は、代わりに以下を使用してください。

foreach my $key ( sort keys %good ) {
        print OUT $key . "\n";
}
于 2013-02-18T08:27:15.367 に答える
0

並べ替えを使用した awk では、少し簡単です。

awk 'FNR==NR{a[$0];next}{if(!($0 in a))print $0}' temp2 temp | sort -u

dynSam/dmndynStm,要件に応じて、出力にも含める必要があると思います。

> awk 'FNR==NR{a[$0];next}{if(!($0 in a))print $0}' temp2 temp | sort -u
dynSam/dmndynStm,
dynSamp/dmlnodExp,
dynSamp/dmlnodLod,
dynSamp/dmlnodUpd,
dynSamp/dmndynLod,
dynSamp/dmndynUpd,
sample/mlnodExp,
sample/mlnodLod,
sample/mlnodUpd,
sample/mndynLod,
sample/mndynUpd,
>
于 2013-02-18T08:43:59.900 に答える