목록의 문자열이 줄의 처음 12자 내에서 발견되면 대용량 파일에서 줄을 제거하시겠습니까?

목록의 문자열이 줄의 처음 12자 내에서 발견되면 대용량 파일에서 줄을 제거하시겠습니까?

아래와 같이 +184000 행 * +5400 행을 포함하는 파일 매트릭스가 있습니다.

denovo1 someverylaaargenumbers and lotandlotsoftextuntil 5400.........
denovo10 someverylaaargenumbers and lotandlotsoftextuntil 5400........
denovo100 someverylaaargenumbers and lotandlotsoftextuntil 5400.......
denovo1000 someverylaaargenumbers and lotandlotsoftextuntil 5400......
denovo10000 someverylaaargenumbers and lotandlotsoftextuntil 5400.....
denovo100000 someverylaaargenumbers and lotandlotsoftextuntil 5400......
denovo184117 someverylaaargenumbers and lotandlotsoftextuntil 5400......

두 번째 파일에는 다음과 같은 식별자 목록이 있습니다.

denovo1
denovo100
denovo1000
denovo100000

식별자가 파일 2에서 발견되면 행렬 1의 행을 지우고 싶습니다. 그러므로:

denovo10 someverylaaargenumbers and lotandlotsoftextuntil 5400........
denovo10000 someverylaaargenumbers and lotandlotsoftextuntil 5400.....
denovo184117 someverylaaargenumbers and lotandlotsoftextuntil 5400......

한 줄씩 읽고 파일 2에서 문자열을 찾는 짧은 유닉스 코드가 있습니다.

while read -r line
do
echo $line
sed -i '' '/$line/d' /my/path/matrix1
done < /my/path/file2

작동은 되지만, 모든 줄을 끝까지 읽어주기 때문에 시간이 오래 걸립니다. 기계가 각 줄의 처음 12자만 읽도록 하는 방법이 있습니까?

답변1

그리고 grep:

grep -vwf file matrix > matrix.new
mv matrix.new matrix
  • 패턴 입력 파일 -f FILE로 사용하는 옵션FILE
  • -w전체 단어를 구성하는 일치 항목을 포함하는 줄만 선택하는 옵션
  • -v일치하지 않는 행을 선택하는 옵션

빈 줄 은 file허용되지 않습니다.

또는 식별자 파일을 수동으로 생성하는 경우 앵커를 사용하여 ^줄의 시작 부분을 일치시키고 각 식별자 뒤에 공백 문자를 추가하여 패턴의 끝을 표시합니다.

printf '^%s \n' denovo{1,100,1000,100000} > file
grep -vf file matrix > matrix.new
mv matrix.new matrix

답변2

노력하다:

$ awk 'FNR==NR{ids[$1]; next} !($1 in ids)' ids file
denovo10 someverylaaargenumbers and lotandlotsoftextuntil 5400........
denovo10000 someverylaaargenumbers and lotandlotsoftextuntil 5400.....
denovo184117 someverylaaargenumbers and lotandlotsoftextuntil 5400......

작동 방식:

  • FNR==NR{ids[$1]; next}

    첫 번째 파일을 읽을 때 id가 있는 ids연관 배열에 키가 생성됩니다 . ids그런 다음 나머지 명령을 건너뛰고 해당 next줄로 이동합니다.

  • !($1 in ids)

    두 번째 파일을 읽을 때 첫 번째 필드가 연관 배열의 키가 아닌 경우 해당 행이 인쇄됩니다 ids.

원본 파일 업데이트

코드가 올바르게 작동한다고 생각되면 파일을 변경할 수 있습니다.

awk 'FNR==NR{ids[$1]; next} !($1 in ids)' ids file >tmp && mv tmp file

관련 정보