コミュニケーション

コミュニケーション

私は簡単なことをしようとしているので、grep存在する行と存在しない行を取得しますgrep -va.txtb.txtc.txt

3つのファイルの例

a.txt:

a
b
c
d
e

up.txt:

a.up
b.up
c.up

dw.txt:

a.dw
b.dw

希望の出力:

c

次のコードを書いていますが、grep全体ではなく毎回1行のように見えます。$(sed...)

sed 's/.up//' /tmp/b.txt | grep -f /tmp/a.txt | grep -vf $(sed 's/.dw//' /tmp/c.txt)

答え1

シングルクイックGNUの使用awk注文する:

awk -F'.' \
'{
     if (ARGIND == 1) a[$1];
     else if (ARGIND == 2 && $1 in a) comm[$1];
     else if (ARGIND == 3){
         delete a;
         if ($1 in comm) delete comm[$1]
     }
 }
 END{ for (i in comm) print i }' a.txt b.txt c.txt

出力:

c

  • -F'.'-.フィールド区切り文字として扱われます。
  • ARGINDARGV- 現在処理中のファイルに対するインデックス(コマンドライン引数配列)
  • comm- 配列一般的なa.txt最初の2つのファイル(および)間b.txtの項目

答え2

すべてのファイルがソートされ、プロセスの置き換えを理解するシェル(たとえばbash)を使用するとします。

$ join -t . -v 1 -o 0 <( join -t . a.txt b.txt ) c.txt
c

または他の殻の場合

$ join -t . a.txt b.txt | join -t . -v 1 -o 0 - c.txt
c

joinこれは、ファイル間のリレーショナル結合を実行するために2回使用されます。データは、ドットで区切られたフィールド(使用)として解釈されます-t .

a.txtとの間の接続はb.txt直接であり、以下を生成します。

a.up
b.up
c.up

これは、両方のファイルにドットで区切られた最初のフィールドが表示される2つのファイルのすべての行です。出力は、リンクされたフィールド(、、、a)と2つのファイルの異なるフィールド(追加データ)で構成されます。bcb.txt

2番目の接続は少し特別です。-v 12番目のファイルのどの行ともペアリングできない最初のファイル(上記の中間結果)のエントリを確認するように求められますc.txt。また、結合フィールド自体(-o 0)のみを表示するように要求します。フラグがない場合は結果が-o得られます。c.up


ファイルがソートされていない場合、各ファイル名はコマンドからに変更できますfile<( sort file )

答え3

コミュニケーション

ファイルがソートされ、重複した行が削除されたとします。

comm -12 a.txt <(cut -d. -f1 b.txt) | comm -23 - <(cut -d. -f1 c.txt)

これはBashとGNUユーティリティを使用してUbuntu用に書かれていますが、他のオペレーティングシステムでも機能できることを願っています。

説明する

  • comm -12両方のファイルが共有する行を印刷する(man comm詳細についてはお読みください)
  • <(...)プロセス置換 - 入力ファイルの代わりにコマンドを使用する
  • cut -d. -f1各行について、最初の点の後のすべての項目を削除します。
  • comm -23最初のファイルに一意の行を印刷します。
  • -ファイルの代わりに標準入力から読み取る

答え4

perl -F\\. -lane '
   $h{@ARGV}{$F[0]}++,next if @ARGV;
   print if exists $h{2}{$_} && !exists $h{1}{$_};
' up.txt dw.txt a.txt

最上位キー「2」と「1」を使用してハッシュ%hを設定します。ここで、2は最初の引数(up.txt)を表し、1はdw.txtを表します。与えられたデータのハッシュ構造は次のとおりです。 (順序は異なる場合があります)

%h = (
   1 => { a => 1, b => 1, },
   2 => { a => 1, b => 1, c => 1, },
);

ご覧のとおり、メインハッシュ%hには2つのミニハッシュがあります。したがって、3番目のパラメータ(a.txt)を読み取るときは、レコードがメインハッシュのミニハッシュ%2とミニハッシュ%1でキーとして表示されるかどうかに基づいています。 %h以内(ハッシュハッシュまたはHoHとも呼ばれる)

関連情報