
두 개의 파일이 있습니다.
file1.txt
abc def ghi jkl mno pqr
file2.txt
abc ghi abc xyz xyz xyz mno jkl def stu
(열 구분 기호는 탭입니다)
나는 다음과 같은 종류의 file1.txt
반대를 시도하고 있습니다.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
다음 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
를 사용하면 의 요소로 구성된 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