reads.fasta
약 5,000,000줄이 포함된 큰 파일(예: ) reads_of_interest
과 추출하려는 줄 번호 목록이 포함된 다른 파일이 있습니다.reads.fasta
이를 수행하는 간단한 명령줄 방법이 있습니까?
즉, 파일이 있습니다 large_file.txt
. line_numbers.txt
형식에 다른 파일이 있습니다.
12
134
1456
나는 그것에서 12
, , 행을 추출하고 싶습니다 . 134
추출하려는 행 수는 약 500,000행입니다.1456
large_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 == NFR
awk가 첫 번째 파일 인수를 처리할 때 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