목록의 각 항목에 대해 파일을 검색하고 각 항목에 대해 새 파일을 인쇄하는 방법

목록의 각 항목에 대해 파일을 검색하고 각 항목에 대해 새 파일을 인쇄하는 방법

list_file이름 목록인 파일( )과 data_file수십만 줄의 텍스트가 포함된 다른 파일( )이 있습니다. 각 줄은 로 시작합니다 . 각 이름으로 시작하는 모든 줄을 검색 하고 각 이름의 줄을 다음으로 내보내고 list_file싶습니다 . 새 파일 ( 이름이 목록에 있는 경우)data_filelist_file*.txt*

나는 이것을 가지고있다

grep -f "list_file" data_file > out.txt

그러나 이것은 목록의 각 줄을 자체 파일로 분리하지 않습니다.

샘플 list_file:

100_fullA
100_fullB
105_fullA
105_fullB
112_fullA
112_fullB
121_fullA
121_fullB

샘플 data_file:

100_fullA NGATCATCGACAC
100_fullB NGATCATCGACAC
105_fullA NGATCATCGACAC
105_fullB NGATCATCGACAC
112_fullA NGATCATCGACAC
112_fullB NGATCATCGACAC
121_fullA NGATCATCGACAC

답변1

list_file예를 들어 연관 배열을 사용하여 에서 조회 테이블(또는 해시)을 구성할 수 있습니다 awk.

awk 'NR==FNR {list[$1]=1; next} $1 in list {print > $1".txt"}' list_file data_file

출력은 파일 등에 저장됩니다 100_fullA.txt.100_fullB.txt

답변2

동적 빌드 명령을 통해 이 작업을 수행할 수 있습니다.

grep -f list_file data_file | sed -e "s/^\([^ ]*\).*/echo '&' >> \1;/" | sh

답변3

Bash를 사용한 솔루션은 다음과 같습니다.

#!/bin/bash

while read pointer; do
 filename="$(echo $pointer | cut -d ' ' -f 1)" 
 if grep $filename list_file > /dev/null; then
  echo $pointer >> output/"$filename".txt
 fi
done < data_file

라인별 분석은 다음과 같습니다.

  • 3행은 data_file을 반복하는 while 루프의 시작 부분입니다.

  • 4행은 현재 반복에서 읽은 행을 에코합니다. 그런 다음 해당 줄은 cut으로 전달되어 공백을 구분 기호로 사용하여 줄의 첫 번째 부분을 잘라냅니다. 그런 다음 결과는 "filename"이라는 변수에 할당됩니다.

  • 5행에서는 grep을 사용하여 이전에 결정된 값이 list_file에 존재하는지 확인합니다. grep이 성공적으로 값을 찾으면(상태 0을 반환) 스크립트는 6행에서 계속됩니다. grep이 아무것도 찾지 못하면(상태 1을 반환) 스크립트는 루프를 다시 시작합니다.

  • 6행은 전체 행을 출력/"$filename".txt에 반영합니다.

  • 7행에서는 if 문을 종료합니다.

  • 8행은 루프를 종료하고 data_file이 참조되는 곳입니다.

기타 중요 사항:

  • "output/" 디렉터리는 스크립트가 실행되기 전에 생성되어야 합니다. 그렇지 않으면 "출력: 해당 파일이나 디렉터리가 없습니다"와 같은 오류가 발생합니다. 이것이 문제라면 스크립트 시작 부분에 "mkdir 출력"을 추가하면 쉽게 해결할 수 있습니다.
  • data_file에 수십만 개의 행이 있다고 언급하셨습니다. 따라서 스크립트를 완료하는 데 시간이 오래 걸릴 수 있습니다. 정보를 얻기 위해 이 파일을 자주 쿼리하는 경우 해당 정보를 MariaDB 또는 유사한 데이터베이스로 변환하는 것이 좋습니다.
  • list_file에도 많은 항목이 포함되어 있으면 5행의 grep이 루프를 반복할 때마다 전체 list_file을 쿼리하기 때문에 스크립트를 실행하는 데 매우 오랜 시간이 걸립니다. 다시 한번 말하지만, 이 문제는 SQL 데이터베이스에서 사용할 수 있는 도구를 통해 해결할 수 있습니다.

관련 정보