두 파일 간의 특정 열 차이를 기반으로 file1에 추가

두 파일 간의 특정 열 차이를 기반으로 file1에 추가

이 두 파일을 비교하고 다음 줄만 인쇄하여 "source.txt"에 추가하고 싶습니다.

01.02.70 08h00,4.4.4.4,443

이것은 내 파일입니다:

소스파일.txt

DATETIME,IPSOURCE,PORT
01.01.70 08h00,0.0.0.0,443
01.01.70 08h00,2.2.2.2,443

이벤트.txt

DATETIME,IPSOURCE,PORT
01.02.70 09h00,0.0.0.0,443
01.02.70 09h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443

비교에서 DATETIME 필드는 신경 쓰지 않고 로그 파일 "events.txt"에 나타나는 새 IP를 "source.txt"에 추가하고 싶습니다(주소 0.0.0.0 및 2.2.2.2는 둘 다에 나타납니다). 파일).

그래서 나는 사용하고 싶다

grep -vxFf source.txt events.txt

첫 번째 필드는 고려하지 않고 IPSOURCE 필드(두 번째 열)에서만 차이점을 찾습니다.

답변1

awk필드 기반 비교가 필요한 경우 사용

$ awk -F, 'NR==FNR{ip[$2]=$0; next} $2 in ip{delete ip[$2]} END{for(k in ip) print ip[k]}' events.txt source.txt
01.02.70 08h00,4.4.4.4,443
  • -F,,입력 필드 구분자로 설정
  • NR==FNR{ip[$2]=$0; next}두 번째 필드를 키로 사용하고 전체 행을 연관 배열에 저장합니다. 이 코드 블록은 첫 번째 파일 입력(예: events.txt)에 대해서만 실행됩니다.
  • $2 in ip{delete ip[$2]}두 번째 파일(예: source.txt)이 처리되는 동안 ip두 번째 필드가 이미 존재하는 경우 배열에서 요소를 제거합니다.
  • END{for(k in ip) print ip[k]}모든 입력이 처리된 후 ip배열의 나머지 줄을 인쇄합니다.


또는 source.txt에 두 번째 필드가 없으면 입력 파일의 순서를 변경하고 events.txt의 행을 인쇄하십시오.

$ awk -F, 'NR==FNR{ip[$2]; next} !($2 in ip)' source.txt events.txt
01.02.70 08h00,4.4.4.4,443

답변2

다음을 수행하세요.

awk -F, 'NR==FNR{arr[$2]=$0;next} !($2 in arr)' source event #>> source

쉼표로 구분된 필드가 있는 두 번째 열을 기반으로 diff 행을 추가하려면 >> source위 명령에서 주석 처리를 해제하면 됩니다.

아니요, IP:port 부분을 기준으로 비교하려는 경우입니다. 그러면 다음과 같이 사용할 수 있습니다.

awk -F, 'NR==FNR{arr[$2FS$3]=$0;next} !($2FS$3 in arr)' source event #>> source

답변3

귀하의 조건에 따라:

  • "source.txt"에 추가하세요.

  • 그냥 추가하고 싶어요새로운로그 파일 "events.txt"에서 "source.txt"로 표시된 IP


이는 GNU 조합을 기반으로 한 완벽한 솔루션입니다.sed,자르다그리고grep:

sed -i "\$ a $(cut -d, -f2 source.txt | grep -vf - events.txt)" source.txt

생성된 source.txt파일 콘텐츠:

DATETIME,IPSOURCE,PORT 
01.01.70 08h00,0.0.0.0,443 
01.01.70 08h00,2.2.2.2,443
01.02.70 08h00,4.4.4.4,443

관련 정보