두 개의 파일이 있습니다. 첫 번째(이메일)는 두 번째(도메인)를 기준으로 정리되어야 합니다. 첫 번째는 15GB이고 두 번째는 160MB입니다.
dom=`cat file2.txt | xargs | sed -e "s/ /|/g"` ; sed -r "/$dom/d" file1.txt >> final_file.txt
이 명령은 나에게 주어졌습니다 bash: /bin/sed: Argument list too long
.
답변1
당신이 원하는 것 같습니다 :
grep -Fvf file2.txt file1.txt > final_file.txt
즉, 행을 포함하지 않는 행에 저장됩니다 final_file.txt
.file1.txt
file2.txt
-x
원하는 행이 file1.txt
없으면 이 옵션을 추가하세요 file2.txt
. 또는 -w
일치하는성격( bar.com
또는에서는 일치하지 않지만 예에서는 여전히 일치합니다).foobar.com
bar.common
foo.bar.com.us
그러나 기가바이트의 데이터와 메가바이트의 다른 문자열을 찾는 경우에도 시간이 오래 걸립니다.
이와 같은 셸을 사용하거나 프로세스 대체를 지원하는 더 빠른 방법은 다음 ksh
과 같습니다 zsh
.bash
export LC_ALL=C
comm -23 <(sort file1.txt) <(sort file2.txt) > final_file.txt
이제 귀하의 의견에서 명시한 대로 file2.txt
도메인 목록이고 file1.txt
해당 도메인으로 끝나는 행을 필터링하려는 경우 더 효율적인 접근 방식은 해시 테이블을 사용하는 것입니다.@
awk -F@ '
! domains_processed {excluded[$0]; next}
! ($NF in excluded)
' file2.txt domains_processed=1 file1.txt > final_file.txt
접근 방식에 문제가 있습니다.
불필요한 사용
cat
(UUOC).cat
연결 파일입니다. 단일 파일에는 큰 의미가 없습니다. 파일의 내용을 푸시하는 프로세스의 파이프 가 아닌 직접 stdin을 파일로 사용xargs < file
하거나< file xargs
만들 수 있습니다 .xargs
cat
xargs
echo
기본적으로 호출됩니다. 인수를 여기에 필요한 공백 문자와 연결하는 동안echo
다른 작업도 수행하며 그 목록은 구현에 따라 다릅니다. 또한xargs
매우 구체적인 형식의 입력을 기대합니다. 여기서는 각 줄을 GNU에 맞게file2.txt
별도의 인수로 전달하기 를 원할 것으로 예상합니다 . 또한 인수 크기 제한을 피하기 위해 필요한 만큼 여러 번 실행될 것입니다. 따라서 160MB 입력의 경우 출력에는 여러 줄이 있습니다.echo
xargs -rd '\n'
xargs
echo
xargs
파일의 줄을 특정 문자와 연결하려면 다음 명령을 사용하세요
paste
.paste -sd '|' file2.txt
여기서는 이러한 단어를 와 결합하여 정규식
sed -r
(-r
GNU 확장으로) 을 작성|
하지만 이 줄에 있는 정규식 연산자를 이스케이프하지는 않습니다. 도메인 이름인 경우.
모든 문자와 일치하는 정규식 연산자라는 점에 유의하세요. 다른 캐릭터와 더 큰 문제가 생길 것입니다.sed "/$dom/r"
완전한 통제권을 갖고 있지 않은 경우file2.txt
.file2.txt
160MB라면 그 정도 입니다$dom
. 명령줄의 크기는 제한되어 있습니다. Linux에서는 단일 매개변수의 크기도 제한되어 있으므로(최대 128KiB)sed
매개변수를 통해 스크립트를 전달할 수 없습니다. 통과해야 합니다-f
.