첫 번째 열에서만 파일의 문자열 목록을 추출합니다.

첫 번째 열에서만 파일의 문자열 목록을 추출합니다.

나는 그것에서 숫자 목록 ( string.txt) 을 추출하고 싶습니다 masterFile.list. 여러 열로 masterFile.list구분되며 |여러 열을 포함합니다. 나는 첫 번째 열에 file 의 일치하는 숫자가 포함된 행에만 관심이 있습니다 string.txt.

문자열.txt:

3075
3078
3076

마스터파일.목록

3078    |       Auxenochlorella pyrenoidosa (H.Chick) Molinari & Calvo-Perez, 2015      |                   |       authority       |
3079    |       Auxenochlorella pyrenoidosa 3078    |               |       scientific name |
3076    |       Chlorella pyrenoidosa H.Chick, 1903     |               |       authority       |
3077    |       Chlorella vulgaris var. viridis Chodat, 1913    |               |       authority
487     |       ATCC 13077      |       ATCC 13077 <type strain>        |       type material   |
460     |       DSM 23076       |       DSM 23076 <type strain> |       type material   |

예상 출력:

3078    |       Auxenochlorella pyrenoidosa (H.Chick) Molinari & Calvo-Perez, 2015      |                       |       authority       |
3076    |       Chlorella pyrenoidosa H.Chick, 1903     |               |       authority       |

내가 찾은 이전 게시물의 대부분은 단일 문자열 추출만 허용하고 일치 항목을 첫 번째 열로 제한합니다. 여러 문자열을 한 번에 추출할 수 있나요?

답변1

다음 프로그램을 사용할 수 있습니다 awk.

awk -F' *|' 'NR==FNR{searchstr[$1]=1} NR>FNR && ($1 in searchstr) {print}' string.txt masterFile.list

보시다시피 이 두 파일을 awk.

  • 첫 번째 파일( 글로벌 라인 FNR카운터와 동일한 파일별 라인 카운터로 표시됨 NR)을 처리할 때 모든 검색 문자열(유일한 항목이므로 라인당 필드 번호 1개)을 하나의 배열 searchstr( 그러나배열 인덱스1이므로 "값"은 )의 더미 값일 뿐입니다 .

  • NR두 번째 파일( 현재는 보다 큼 ) 에 도달하면 첫 번째 열( )에 다음이 포함되어 있는지 FNR확인합니다.$1배열 인덱스로존재하다 searchstr. 그렇다면 전체 줄을 인쇄합니다.

이에 대한 아이디어는 awk배열 인덱스 목록 내에 있는 경우 참인 편리한 구문을 갖는 것입니다.string in arraystringarray

Ed Morton이 지적했듯이 "골프"를 할 수 있습니다.

awk -F' *|' 'NR==FNR{searchstr[$1]; next} $1 in searchstr' string.txt masterFile.list

searchstr[$1]호출은 배열 항목을 정의하지만 채우지는 않습니다.$1 in searchstr 외부규칙 블록의 - if 평가 대상 true- 지시문은 awk현재 행을 인쇄합니다. next처리 규칙의 지시문은 string.txt해당 부분에만 도달하도록 보장 합니다.masterFile.list

"첫 번째 필드"가 실제로 숫자인지 확인하기 위해 필드 구분 기호로 전체 정규식( *|, 즉 공백 뒤에 )을 지정했습니다 . 이를 지정하면 후행 공백도 포함되어 매칭이 이루어집니다. 프로세스가 더 복잡해졌습니다. "공백"에 실제로 탭 문자도 포함될 수 있는 경우 대신 이를 사용하세요.|masterFile.list-F'|'-F'[[:space:]]*|'

답변2

다른 사람들이 지적했듯이 여러 가지 옵션이 있습니다.

for i in $(cat string.txt); do grep -E "(^$i)" masterFile.txt; done

답변3

이것은 당신에게 도움이 될 것입니다

cat string.txt| while read -r str; do egrep "^$str *\|" masterFile.list;done

관련 정보