bash: /bin/sed: 매개변수 목록이 너무 깁니다.

bash: /bin/sed: 매개변수 목록이 너무 깁니다.

두 개의 파일이 있습니다. 첫 번째(이메일)는 두 번째(도메인)를 기준으로 정리되어야 합니다. 첫 번째는 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.txtfile2.txt

-x원하는 행이 file1.txt없으면 이 옵션을 추가하세요 file2.txt. 또는 -w일치하는성격( bar.com또는에서는 일치하지 않지만 예에서는 여전히 일치합니다).foobar.combar.commonfoo.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만들 수 있습니다 .xargscat

  • xargsecho기본적으로 호출됩니다. 인수를 여기에 필요한 공백 문자와 연결하는 동안 echo다른 작업도 수행하며 그 목록은 구현에 따라 다릅니다. 또한 xargs매우 구체적인 형식의 입력을 기대합니다. 여기서는 각 줄을 GNU에 맞게 file2.txt별도의 인수로 전달하기 를 원할 것으로 예상합니다 . 또한 인수 크기 제한을 피하기 위해 필요한 만큼 여러 번 실행될 것입니다. 따라서 160MB 입력의 경우 출력에는 여러 줄이 있습니다.echoxargs -rd '\n'xargsechoxargs

    파일의 줄을 특정 문자와 연결하려면 다음 명령을 사용하세요 paste.

    paste -sd '|' file2.txt
    
  • 여기서는 이러한 단어를 와 결합하여 정규식 sed -r( -rGNU 확장으로) 을 작성 |하지만 이 줄에 있는 정규식 연산자를 이스케이프하지는 않습니다. 도메인 이름인 경우 .모든 문자와 일치하는 정규식 연산자라는 점에 유의하세요. 다른 캐릭터와 더 큰 문제가 생길 것입니다. sed "/$dom/r"완전한 통제권을 갖고 있지 않은 경우 file2.txt.

  • file2.txt160MB라면 그 정도 입니다 $dom. 명령줄의 크기는 제한되어 있습니다. Linux에서는 단일 매개변수의 크기도 제한되어 있으므로(최대 128KiB) sed매개변수를 통해 스크립트를 전달할 수 없습니다. 통과해야 합니다 -f.

관련 정보