여러 열이 포함된 파일에서 grep

여러 열이 포함된 파일에서 grep

숫자가 탭으로 구분된 someNumbers.txt라는 파일이 있습니다. 예를 들면 다음과 같습니다.

1   1
2   1
5   1
7   1
10  1

숫자가 포함된 다른 파일(예: EvenNumbers.txt)에서 someNumbers.txt의 첫 번째 열에 있는 숫자를 검색하고 싶습니다.

2   1
4   1
6   1
8   1
10  1

내가 원하는 출력은 다음과 같습니다.

2   1
10  1

더 간단한 시나리오에서 someNumbers.txt는 다음과 같습니다.

1
2
5
7
10

EvenNumbers.txt는 다음과 같습니다.

2
4
6
8
10

난 그냥 할 수 있어요

grep -f someNumbers.txt evenNnumbers.txt

출력을 얻습니다.

2
10

파일이 탭으로 구분되어 있으면 어떻게 해야 합니까? 감사해요

답변1

논리가 열로 정의되는 경우 awk기본 구문 분석 행을 사용하고 필드로 분할하는 것이 더 간단한 경우도 있습니다. 따라서 줄의 시작 부분을 일치시키거나 공백을 신경 쓸 필요가 없습니다. 이 예:

grep -Ff file2 file1

다음과 같이 쓸 수 있습니다:

awk 'FNR==NR{map[$0]; next} $0 in map' file2 file1

각 파일에 두 개의 열이 있고 위의 내용을 수정하려는 경우 $0첫 번째 필드( $1)의 전체 행을 찾는 대신 각 파일의 첫 번째 열만 고려하는 것이 매우 간단합니다.

awk 'FNR==NR{map[$1]; next} $1 in map' file2 file1

grep을 사용하면 첫 번째 파일의 첫 번째 열만 유지하여 필드 경계와 일치하며 이는 다음과 같습니다.

grep -f <(awk '{print "^" $1 "[[:space:]]"}' file2) file1

줄의 시작 부분과 다음 공백을 일치시키거나 줄의 끝 부분도 일치시킬 수도 있습니다. 그리고 더 이상 고정된 패턴을 찾지 않습니다. 필드(예: 두 번째 필드 일치) 또는 필드 구분 기호를 수정하는 경우 더 많은 작업이 필요합니다. Division 을 활용하면 awk이러한 문제에 대해 생각하지 않습니다.

답변2

주문하다

awk 'NR==FNR {a[$1];next}($1 in a){print $0}' someNumbers.txt evenNumbers.txt

산출

2   1
10  1

관련 정보