![두 파일 간의 특정 열 차이를 기반으로 file1에 추가](https://linux55.com/image/119443/%EB%91%90%20%ED%8C%8C%EC%9D%BC%20%EA%B0%84%EC%9D%98%20%ED%8A%B9%EC%A0%95%20%EC%97%B4%20%EC%B0%A8%EC%9D%B4%EB%A5%BC%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20file1%EC%97%90%20%EC%B6%94%EA%B0%80.png)
이 두 파일을 비교하고 다음 줄만 인쇄하여 "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