두 파일을 비교한 다음 부분적으로 일치하지 않는 줄을 추가하는 방법은 무엇입니까?

두 파일을 비교한 다음 부분적으로 일치하지 않는 줄을 추가하는 방법은 무엇입니까?

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사용할 수 있습니다.tmptmp

하위 쉘의 입력과 상위 쉘의 출력에 동일한 파일 이름을 사용하면 충돌이 발생합니까?

답변4

또한 사용할 수 있습니다 join.

join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)

관련 정보