
ファイルが2つあります。
file1.txt
abc def ghi jkl mno pqr
file2.txt
abc ghi abc xyz xyz xyz mno jkl def stu
(列区切りはタブです)
私は次のようにして、file1.txt
aggressionを grep しようとしています:file2.txt
grep -w -f file1.txt file2.txt
次のような出力が得られます。
abc ghi
abc xyz
mno jkl
def stu
しかし、私が欲しいのは、両方の列 1 と列 2 には、次のようにfile2.txt
ヒットがありますfile1.txt
。
abc ghi
mno jkl
どのような助けでも歓迎します。
ありがとう。
ダン
答え1
の各値をfile1.txt
配列 に保存しますa
。次に、file2.txt
の 1 番目と 2 番目のフィールドの両方を持つ行を解析して出力しますa
。
awk 'NR==FNR{a[$0];next}$1 in a && $2 in a' file1.txt file2.txt
内の任意の数のフィールドについてfile2.txt
、すべてのフィールドをループしてチェックを実行します。フィールドの 1 つが 内にない場合はa
次の行に進み、それ以外の場合は行を出力します。
awk 'NR==FNR{a[$0];next}{for(i=1;i<=NF;i++){if(!($i in a)){next}}print}' file1.txt file2.txt
答え2
を使用すると、 の要素を含むpython
スーパーセットを作成することで pbm にアプローチできます。b
file1.txt
次に、読み取った各行について、file2.txt
現在の行から形成された集合がスーパーセットbのサブセットであるかどうかを確認します。その場合、file2.txtの現在の行を出力します。
$ python3 -c 'import sys
f1, f2 = sys.argv[1:]
with open(f1) as fh1, open(f2) as fh2:
b = set([l.strip() for l in fh1])
print(*(l.rstrip() for l in fh2 if set(l.strip().split()).issubset(b)), sep="\n")
' file1.txt file2.txt
abc ghi
mno jkl
$ perl -lane '$. == 1 and
%h = map { /(.*)(\n)/ } <STDIN>;
print if ! grep { ! $h{$_} } @F;
' file2.txt < file1.txt
sed を使用して、file1.txt をホールド スペースに保存し、File2.txt から読み取った各行について、現在の行のすべての要素の存在と比較し、すべてが見つかった場合は出力します。
$ sed -Ee '
/\n/{h;d;}
/\s/!{H;d;}
G;h
s/\n.*//;s/\n//;x
:a
s/^\s?(\S+)((\s\S+)?\n.*\n\1(\n|$))/\2/
ta
s/^\n//;tb
D;:b;x
' file1.txt file2.txt
while IFS= read -r l <&3; do
read -r a b <<<"$l"
grep -qFe "$a" file1.txt &&
grep -qFe "$b" file1.txt &&
printf '<%s>\n' "$l"
done 3< file2.txt