텍스트 파일에서 줄을 추출하는 명령줄 도구

텍스트 파일에서 줄을 추출하는 명령줄 도구

reads.fasta약 5,000,000줄이 포함된 큰 파일(예: ) reads_of_interest과 추출하려는 줄 번호 목록이 포함된 다른 파일이 있습니다.reads.fasta

이를 수행하는 간단한 명령줄 방법이 있습니까?

즉, 파일이 있습니다 large_file.txt. line_numbers.txt형식에 다른 파일이 있습니다.

12 
134
1456

나는 그것에서 12, , 행을 추출하고 싶습니다 . 134추출하려는 행 수는 약 500,000행입니다.1456large_file.txt

감사해요!

답변1

이는 원하는 것을 얻을 수 있는 간단하고 직접적인 방법입니다. 여기서 문제는 모든 것이 large_file.txt스캔된다는 것입니다. 속도가 너무 느리면 다른 방법을 시도해 보세요. 그 중 하나는 줄 번호로 입력된 데이터베이스에 파일을 로드하는 것인데, 이는 파일을 스캔하는 것에 비해 매우 빠른 검색을 제공합니다.

#!/bin/sh
awk '
    NR == FNR {
        for (i=1; i<=NF; i++) {
            linenums[$i]
        }
    }
    NR != FNR {
        if (FNR in linenums) {
            print
        }
    }
' line_numbers.txt large_file.txt

NR는 현재 레코드 번호(Number of Records)이고, FNR은 현재 파일의 현재 레코드 번호입니다.

따라서 NR == NFRawk가 첫 번째 파일 인수를 처리할 때 NR != NFR awk두 번째(또는 그 이후) 파일은 언제 처리합니까?

이는 모든 행 번호를 읽고 이를 데이터 요소 없이 키(배열)만 있는 배열 line_numbers.txt에 키로 저장합니다 .linenums

large_file.txt두 번째 파일을 읽을 때 현재 레코드 번호가 이미 배열의 키로 저장되어 있으면 linenums다음 줄이 인쇄됩니다.large_file.txt

배열에서 행 번호를 찾는 이 방법은 내부 해싱 알고리즘을 사용하여 키를 찾기 linenums때문에 상대적으로 빠릅니다 .awk

답변2

file_numbers.txt에 한 줄이 포함되어 있고 해당 줄이 너무 크지 않다고 가정하면 다음이 작동합니다.

sed -n "$(<file_numbers.txt sed -e "s/ /p;/g" -e "s/$/p/")" large_file.txt

관련 정보