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
앞에 추가하는 경우 :file1
grep
$ cut -d, -f3 file2 | grep -v -f file1
tim.jones
bill.smith
를 사용하면 -f
패턴 이 grep
발견됩니다 file1
. 이 기능이 없으면 단순히 file1
텍스트 모드로 작동합니다.
이후를 사용할 수도 있습니다 -F
. 그렇지 않으면 패턴의 점이 "모든 문자"로 해석됩니다. 또한 전체 줄이 일치 -x
하도록 입력할 수도 있습니다 ( 일치하지 않아야 하는 줄이 있는 경우 유용합니다 ).grep
joe.smith
joe.smiths
$ cut -d, -f3 file2 | grep -v -F -x -f file1
분명히 이것은 줄 끝에 후행 공백이 필요하지 않습니다 file1
(질문 텍스트에 있는 것으로 보입니다).
sed
출력에 cut
가 포함되어 있지 않으므로 이는 필요하지 않습니다 "
. 또한,필요모두 제거 "
하면 tr -d '"'
더 나은 도구가 될 것입니다.
답변2
이 시도. sed
아니요 GNU diff
및 bash
.
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
%
물론 여기에는 추가 임시 파일(또는 파일 설명자가 있는 재미와 게임)이 필요하며 큰 파일을 사용하고 싶지 않습니다.
내가 이것을 언급하는 이유는 파일 간의 일치와 관련된 작업의 경우 sort
plus가 uniq
놀랍도록 다재다능하고 아마도 과소평가된 도구 쌍이기 때문입니다. 빠른 작업의 경우, 결과를 얻을 수 있는 간편한 방법을 제공할 수 있습니다.