2つのファイルがあります。
file1.txt
abc def ghi jkl mno pqr
file2.txt
abc ghi abc xyz xyz xyz mno jkl def stu
(列区切り記号はタブです)
私はfile1.txt
次のようにgrepしようとしています。file2.txt
grep -w -f file1.txt file2.txt
次の結果が表示されます。
abc ghi
abc xyz
mno jkl
def stu
しかし、私が望むのは出力です両方以下のように、列1と列2file2.txt
に照会があります。file1.txt
abc ghi
mno jkl
どんな助けでも歓迎します。
ありがとうございます。
クマ
答え1
各値をfile1.txt
配列に保存しますa
。次に、file2.txt
最初のフィールドと2番目のフィールドの両方を含む行を解析して印刷しますa
。
awk 'NR==FNR{a[$0];next}$1 in a && $2 in a' file1.txt file2.txt
のフィールド数に関係なく、file2.txt
すべてのフィールドを繰り返して検査を実行します。フィールドのいずれかがにない場合は次の行にa
進み、そうでない場合はその行を印刷します。
awk 'NR==FNR{a[$0];next}{for(i=1;i<=NF;i++){if(!($i in a)){next}}print}' file1.txt file2.txt
答え2
pbmを使用すると、要素を含む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