![두 파일을 비교한 다음 부분적으로 일치하지 않는 줄을 추가하는 방법은 무엇입니까?](https://linux55.com/image/183407/%EB%91%90%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%9C%20%EB%8B%A4%EC%9D%8C%20%EB%B6%80%EB%B6%84%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%9D%BC%EC%B9%98%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%A4%84%EC%9D%84%20%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
Extensions.txt
두 파일( 및 ) 을 비교하려고 합니다 Temp.txt
. Extensions.txt
부분적으로 일치하지 않는 행이 있는 경우 Temp.txt
누락된 행을 Temp.txt
.
Extensions.txt
(매우 기본, 하나의 열):
111
1234
4321
Temp.txt
:
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
기본적으로 내가 원하는 것은 /
첫 번째 열에서 이전의 모든 항목을 기반으로 일치 항목을 찾는 것입니다. 일치 항목이 없으면 일치하지 않는 줄을 파일 맨 아래에 인쇄하여 다음과 같이 끝납니다.
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
지금까지 이것을 시도해 보았지만 grep -v
원하는 결과가 나오지 않았습니다. 저도 시도해 보았지만 awk
이것이 갈 길인 것 같지만 awk
적절한 결과를 얻기 위해 어떻게 작동하는지 완전히 이해하지 못합니다.
답변1
다음 명령을 사용하여 파일을 구문 분석할 수 있습니다.awk
awk -F '/' '
FNR == NR {seen[$1] = $0; next}
{if ($1 in seen) print seen[$1]; else missing[$1]}
END {for (x in missing) print x}
' Temp.txt Extensions.txt
산출:
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
- 필드 구분 기호를 슬래시로 설정하고,
-F '/'
FNR == NR
첫 번째 입력 파일의 라인에서 다음 작업을 수행합니다.seen
행을 연관 배열의 키로 저장한 다음 해당 행으로 이동 합니다next
.- 이때 두 번째 파일에 대해 두 번째 작업이 수행됩니다
FNR != NR
. 첫 번째 필드가 일치하면 저장된 행을 인쇄else
하고 해당 필드를 다른 배열에 저장합니다missing
. - 에서는
END
누락된 줄을 인쇄합니다.
답변2
Extensions.txt
배열 의 내용을 읽고 , 부분적으로 일치하는 항목을 제거하고, 나머지를 인쇄할 수 있습니다.
$ awk -F/ '
NR==FNR {a[$1]; next} {for(i in a) if($1 ~ i) delete a[i]} END{for(i in a) print i} 1
' Extensions.txt Temp.txt
1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
답변3
grep
+를 사용하세요 cut
:
grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp
여기서는 패턴이 추가된 패턴으로 동일한 파일에 결과를 공급하고 다시 기록하므로 프로세스 대체의 입력을 안전하게 grep
사용할 수 있습니다.tmp
tmp
답변4
또한 사용할 수 있습니다 join
.
join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)