sed에서 grep으로의 파이핑이 예상대로 작동하지 않는 것 같습니다.

sed에서 grep으로의 파이핑이 예상대로 작동하지 않는 것 같습니다.

2개의 파일이 있습니다.

$ cat file1  
jim.smith  
john.doe  
bill.johnson  
alex.smith  

$ cat file2   
"1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321      
"1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976     
"1/30/2017 11:14:03 AM",New customer,john.doe,CA,1485771243  
"1/30/2017 11:13:53 AM",New customer,bill.smith,CA,1485771233  

file1에 없는 file2의 모든 이름을 가져오고 싶습니다.
다음은 작동하지 않습니다:

$ cut -d, -f 3 file2 | sed 's/"//g' | grep -v file1  
jim.smith  
tim.jones  
john.doe  
bill.smith  

이 경우 파이프에 대한 grep -v가 작동하지 않는 이유는 무엇입니까?

답변1

사실 이게 내 마지막 단계야이전 질문에 답변하려면.

-f앞에 추가하는 경우 :file1grep

$ cut -d, -f3 file2 | grep -v -f file1
tim.jones
bill.smith

를 사용하면 -f패턴 이 grep발견됩니다 file1. 이 기능이 없으면 단순히 file1텍스트 모드로 작동합니다.

이후를 사용할 수도 있습니다 -F. 그렇지 않으면 패턴의 점이 "모든 문자"로 해석됩니다. 또한 전체 줄이 일치 -x하도록 입력할 수도 있습니다 ( 일치하지 않아야 하는 줄이 있는 경우 유용합니다 ).grepjoe.smithjoe.smiths

$ cut -d, -f3 file2 | grep -v -F -x -f file1

분명히 이것은 줄 끝에 후행 공백이 필요하지 않습니다 file1(질문 텍스트에 있는 것으로 보입니다).

sed출력에 cut가 포함되어 있지 않으므로 이는 필요하지 않습니다 ". 또한,필요모두 제거 "하면 tr -d '"'더 나은 도구가 될 것입니다.

답변2

이 시도. sed아니요 GNU diffbash.

diff --new-line-format="" --unchanged-line-format="" <(cut -f3 -d, file2|sort) <(sort file1)

수확량 결과:

bill.smith
tim.jones

답변3

이것은 작동합니다:

$ pattern=$(cut -d, -f 3 file2)
$ grep -v -e "$pattern" file1  

귀하의 경우 grep이 패턴을 놓쳤습니다. 또한 grep은 파일이나 표준 입력(파이프를 통해)을 읽을 수 있지만 둘 다 읽을 수는 없습니다. 파일 이름이 지정되지 않으면 grep은 stdin에서 읽습니다.

또는 다음과 같이 작동할 수도 있습니다.

$ grep -v -f <(cut -d, -f3 file1) file2  

죄송합니다. 아직 테스트되지 않았습니다.

답변4

대답은 grep -f아마도 최고일 것입니다. 그러나 약간 더 세련된 대안은 다음과 같습니다.

% cut -d, -f3 file2 >names2
% cat file1 file1 names2 | sort | uniq -u
bill.smith
tim.jones
%

물론 여기에는 추가 임시 파일(또는 파일 설명자가 있는 재미와 게임)이 필요하며 큰 파일을 사용하고 싶지 않습니다.

내가 이것을 언급하는 이유는 파일 간의 일치와 관련된 작업의 경우 sortplus가 uniq놀랍도록 다재다능하고 아마도 과소평가된 도구 쌍이기 때문입니다. 빠른 작업의 경우, 결과를 얻을 수 있는 간편한 방법을 제공할 수 있습니다.

관련 정보