다른 파일에서 발견된 줄을 기반으로 파일에서 줄 제거

다른 파일에서 발견된 줄을 기반으로 파일에서 줄 제거

file1.txt 파일에는 다음 줄이 포함되어 있습니다.

/api/purchase/<hash>/index.html

예를 들어:

/api/purchase/12ab09f46/index.html

file2.csv 파일에는 다음 줄이 포함되어 있습니다.

<hash>,timestamp,ip_address

예를 들어:

12ab09f46,20150812235200,22.231.113.64 
a77b3ff22,20150812235959,194.66.82.11

file2.csv를 필터링하고 file1.txt에서 해시 값도 존재하는 모든 줄을 제거하고 싶습니다. 즉 말하자면:

cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv

또는 그런 것.

간단해야하지만 제대로 작동하지 않는 것 같습니다.

누구든지 이 작업에 대해 작동하는 파이프라인을 제공할 수 있습니까?

답변1

cut -d / -f 4 file1.txt | paste -sd '|' | xargs -I{} grep -v -E {} file2.csv

설명하다:

cut -d / -f 4 file1.txt해시 값은 첫 번째 파일에서 선택됩니다.

paste -sd '|'모든 해시 값을 정규 표현식으로 연결합니다.H1|H2|H3

xargs -I{} grep -v -E {} file2.csv{}grep은 이전 패턴을 인수로 사용하여 호출되고 xargs는 다음 으로 대체됩니다.STDIN

없으시면 paste대체품으로 대체하시면 됩니다tr "\\n" "|" | sed 's/|$//'

답변2

가능한 awk해결책:

awk 'NR == FNR { x[$4] = 1; next; } { if (!($1 in x)) print $0; }' FS="/" file1.txt FS="," file2.txt

먼저 (필드 구분 기호) "/" file1.txt를 사용하여 읽고 원하는 해시 값인 FS필드의 키 값으로 배열 x를 만듭니다 . 다음으로 두 번째 파일 설정을 $4읽고 필드 값이 배열의 키로 존재하지 않는지 확인 하고 , 없으면 인쇄합니다. 의견에 제안된 보다 관용적인 진술은 다음과 같습니다.file2.txtFS,$1x

awk 'NR == FNR { x[$4] = 1; next; } !($1 in x)' FS="/" file1.txt FS="," file2.txt

답변3

~을 위한GNU sed

sed -z 's%.*/\([^/]*\)/index.html\n%\1\\|%g;s%^%/%;s%\\|$%/d%' file1.csv |
sed -f - file2.csv

어디첫 번째 sedsed-command-format으로 해시 목록을 생성 /12ab09f46\|a77b3ff22\|..../d하고 다음으로 전송합니다.다음 sed-script는 입력에서 위 명령을 읽으므로 -f -옵션입니다.
같은grep

grep -oP '[^/]*(?=/index.html$)' file1.csv | grep -Fvf - file2.csv

또는 Perl 표현식 없이:

grep -o '[^/]*/index.html$' file1.csv | 
grep -o '^[^/]*' | 
grep -Fvf - file2.csv

아니면 더 나은자르다:

cut -d/ -f4 file1.csv | grep -Fvf - file2.csv

답변4

방금 다음 안감 중 하나를 사용해 보았는데 효과가 있는 것 같습니다.

 for i in `cat file1.txt  | awk -F"/" '{print $4}'`; do echo "\n $i" ; sed -ri "/^$i,/d" file2.csv ; done

먼저 교체해주세요-내부에그리고-에 대한그것을 테스트하기 위해.-에 대한테스트 실행을 수행하고 모든 것이 제대로 작동하면 실행할 수 있습니다.-내부에

관련 정보