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.txt
FS
,
$1
x
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
먼저 교체해주세요-내부에그리고-에 대한그것을 테스트하기 위해.-에 대한테스트 실행을 수행하고 모든 것이 제대로 작동하면 실행할 수 있습니다.-내부에