私は簡単なことをしようとしているので、grep
存在する行と存在しない行を取得しますgrep -v
。a.txt
b.txt
c.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'.'
-.
フィールド区切り文字として扱われます。ARGIND
ARGV
- 現在処理中のファイルに対するインデックス(コマンドライン引数配列)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つのファイルの異なるフィールド(追加データ)で構成されます。b
c
b.txt
2番目の接続は少し特別です。-v 1
2番目のファイルのどの行ともペアリングできない最初のファイル(上記の中間結果)のエントリを確認するように求められます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とも呼ばれる)