세 개의 파일이 있는데 file1.txt
형식이 동일합니다(데이터 유형이 동일하고 열 수가 동일함).file2.txt
file3.txt
컬럼 2와 컬럼 3을 각각 비교하여 출력 파일 file1.txt
에 존재하지 않는 레코드를 선택하고 싶습니다 file2.txt
. 이 작업을 수행하는 방법을 도와주실 수 있나요?file3.txt
out.txt
입력 예:
file1.txt
abc 1 a f11 f13 f14
abd 2 b f12 f14 f13
abe 4 d f13 f16 f12
acf 6 s f14 f15 f19
file2.txt
abc 1 a f21 f23 f24
abd 1 b f21 f24 f23
abe 4 d f24 f26 f22
acf 6 s f23 f25 f29
file3.txt
abc 1 a f31 f33 f34
abd 3 b f31 f34 f33
acf 6 s f33 f35 f39
abe 3 d f34 f36 f32
원하는 출력
out.txt
abd 2 b f12 f14 f13
이 행 외에 다른 행이 에 존재합니다 file2.txt
.file3.txt
답변1
네가 그렇게 좋아한다면awk
awk '
FILENAME != ARGV[3] {
m[$2,$3] = 1
next
}
!(($2,$3) in m)
' file3.txt file2.txt file1.txt > out.txt
나한테는 쉬운 일이야
cut -d" " -f 2,3 file2.txt file3.txt | grep -v -f - file1.txt > out.txt
답변2
가능한 해결책 awk
:
awk 'FILENAME == ARGV[1] {
m[$2,$3] = $0;
next;
}
FILENAME == ARGV[2] {
if (!(($2,$3) in m)) {
m[$2,$3] = $0;
}
next;
}
{
if (!(($2,$3) in m)) {
print $0 >"out.txt";
}
}' file3.txt file2.txt file1.txt
먼저 첫 번째 파일을 읽고 열 2와 3에 대한 키가 포함된 배열을 만듭니다.
그런 다음 두 번째 파일을 읽고 열 2와 3의 키가 첫 번째 배열에 있는지 확인하고, 없으면 배열에 추가합니다.
마지막으로 첫 번째 파일을 읽고 배열에 키가 있는지 확인합니다. 그렇지 않은 경우 관심 있는 행이 바로 그 행입니다.
출력.txt첫 번째 파일에는 다른 두 파일에 나타나지 않는 줄이 포함되어야 합니다.
abd 2 b f12 f14 f13