나는 그것에서 숫자 목록 ( 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 array
string
array
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