2개의 파일이 있습니다.
- 내가 찾고 싶은 값이 가득한 파일
- 내 소스 텍스트 파일
나는 값 목록을 반복하고 소스 파일에 대해 grep을 수행하는 짧은 쉘 명령을 작성했습니다. 파일에서 값을 찾을 수 없으면 값을 인쇄하고 싶습니다.
문제는 모든 값을 인쇄하기 때문에 값을 제대로 grep하지 않아서 항상 일치하지 않고 값을 인쇄한다는 것입니다. 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있기를 바랍니다. 미리 감사드립니다.
이건 내 스크립트야
for i in `cat uniq_val.out`
do
found=`grep "$i" fd.out`
if [ -z "${found}" ]
then
echo $i
fi
done
예를 들어, 내 uniq_val.out에 다음이 포함되어 있는 경우:
abc123
def456
ghi789
jkl101112
mno131415
내 fd.out에는 다음 내용이 포함되어 있습니다.
abc123
def456
mno131415
내 쉘 스크립트가 반환되기를 원합니다
ghi789
jkl101112
답변1
다음과 같은 다양한 접근 방식을 권장합니다.
grep -f <(grep -o -f uniq_val.out fd.out) -v uniq_val.out
즉, 내부적으로 는 패턴 파일 grep
로 작동 하고 일치하는 부분만 반환합니다. 외부적으로 grep은 목록에서 이러한 값의 역수를 수행합니다.uniq_val.out
grep
그러나 내가 아는 한 -o
이것은 POSIX가 아닙니다.
편집하다다음과 같은 문제가 있는 샘플 파일:
두 파일 모두 실제로 일치만 필요한 한 줄 문자열인 경우 패턴 파일의 논리를 반대로 바꾸고 -x
전체 줄 일치를 사용합니다.
grep -vx -f fd.out uniq_val.out
이는 POSIX와 호환됩니다.
답변2
GNU coreutils는 (정렬된) 문자열 세트로 작업하기 위한 도구를 제공합니다. 귀하의 경우 grep
for 루프를 포기하고 comm
대신 사용하는 것이 좋습니다.
$ comm -23 uniq_val.out fd.out
ghi789
jkl101112
man comm
:
comm - 정렬된 두 파일을 한 줄씩 비교합니다.
-2
및 키는 FILE1에 특정한 행만-3
인쇄합니다 .comm
문자열 및 테이블 세트에 사용할 수 있는 다른 유용한 도구로는 데이터 tr
를 준비하는 , 및 몇 가지 간단한 작업을 수행하는 데 사용할 수 있습니다. 이러한 도구는 and 는 물론이고 universal , and보다 더 간단 합니다 .sort
uniq
join
cut
paste
sed
grep
awk
perl
python