숫자가 탭으로 구분된 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