n個のファイルの通信

n個のファイルの通信

n個(つまり、2個以上)ファイルの通信機能を探しています。

man comm内容は次のとおりです。

COMM(1)

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

DESCRIPTION
       Compare sorted files FILE1 and FILE2 line by line.

       With no options, produce three-column output.
       Column one contains lines unique to FILE1,
       column two contains lines unique to FILE2,
       and column three contains lines common to both files.

このアイデアを説明するために、Bashで最適化されていない最初の別の形式の方法は次のとおりです。

user@host MINGW64 dir
$ ls
abc  ac  ad  bca  bcd

user@host MINGW64 dir
$ tail -n +1 *
==> abc <==
a
b
c

==> ac <==
a
c

==> ad <==
a
d

==> bca <==
b
c
a

==> bcd <==
b
c
d

user@host MINGW64 dir
$ bat otherdir/ncomm.sh
───────┬───────────────────────────────────────────────────────────────────────
       │ File: otherdir/ncomm.sh
───────┼───────────────────────────────────────────────────────────────────────
   1   │ #!/usr/bin/env bash
   2   │ ALLENTRIES=$(sort -u "$@")
   3   │ echo "all $*" | tr " " "\t"
   4   │
   5   │ for entry in $ALLENTRIES; do
   6   │     >&2 echo -en "${entry}\t"
   7   │     for file in "$@"; do
   8   │         foundentry=$(grep "$entry" "$file")
   9   │         echo -en "${foundentry}\t"
  10   │     done
  11   │     echo -en "\n"
  12   │ done
───────┴───────────────────────────────────────────────────────────────────────

user@host MINGW64 dir
$ time otherdir/ncomm.sh *
all     abc     ac      ad      bca     bcd
a       a       a       a       a
b       b                       b       b
c       c       c               c       c
d                       d               d

real    0m12.921s
user    0m0.579s
sys     0m4.586s

user@host MINGW64 dir
$

これにより、列ヘッダーがstderrに表示されます。最初の列「all」には、2つのファイルのうちの1つ(ソート済み)で見つかったすべての項目が含まれ、引数リスト内のファイルごとに1つの列がその行にその項目とともに表示されます。 grepは最初の列と行を超えてすべてのセルに対して一度呼び出されますが、これは本当に遅いです。

commの場合、この出力はidなどの短い行/項目にのみ適用されます。よりきれいなバージョンは、2+列の各項目に対してxまたは類似のものを出力します。

これは、Windows MSYS2のGitとRHELで動作します。

これをより効率的な方法でどのように達成できますか?

ベストアンサー1

meld(ただし、グラフィックプログラムです。)ファイル間の3方向比較(例:n = 3)を管理することは依然として可能ですが、より大きなファイルの場合、これを実装することはますます計算的に複雑になるため、そうですdiff(または)ツールです。 。comm

おすすめ記事