![file1에 존재하는 file2에도 동일한 줄이 필요합니다.](https://linux55.com/image/150430/file1%EC%97%90%20%EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%20file2%EC%97%90%EB%8F%84%20%EB%8F%99%EC%9D%BC%ED%95%9C%20%EC%A4%84%EC%9D%B4%20%ED%95%84%EC%9A%94%ED%95%A9%EB%8B%88%EB%8B%A4..png)
File1 각 행에는 숫자(0~9자리)가 포함되어 있으며 총 레코드 수는 20k입니다. File2 첫 번째 열에는 숫자(0~9자리)가 포함되어 있으며 각 행에는 기타 정보가 포함되어 있으며 총 레코드 수는 46,000,00 두 파일이 모두 정렬되어 있습니다. file1에 공통 항목이 있는 모든 레코드에 대해 file2를 grep해야 합니다.
파일 1
988676562
99373
133838000
파일 2
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
2233747 Eheueueu. ,446,ttttiieenjs
44577333 Euedjdbebe,777,rrididjd
산출
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
시도했지만 fgrep -f file1 file2
출력이 0입니다.
명확히 하자면, 두 파일의 첫 번째 열은 정확히 동일합니다.
답변1
File1
귀하의 줄 에 빈 줄이 포함되어 있는지 잘 모르겠습니다 . 그래서 숫자가 없는 행은 무시하도록 했습니다. 또한 귀하의 예에는 File1
후행 공백이 포함되어 있는 것 같습니다. 이렇게 하면 숫자가 아닌 문자의 앞뒤 문자를 모두 제거합니다.
이 파일을 사용하여 sed
스키마를 생성 grep
하고 결과를 스키마 파일 grep
로 File2
.
grep -f <(grep '[0-9]' File1 | sed 's/[^0-9]*\([0-9]*\).*/^\1[^0-9]*.*$/' ) File2
이 인쇄
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu
설명하다:
숫자가 포함된 행 추출
grep '[0-9]' File1
grep
가능한 선행 및 후행 쓰레기를 제거하고 줄 시작 부분에서 숫자를 찾고 숫자가 아닌 문자와 기타 문자가 뒤따르거나 줄 끝까지 아무것도 찾지 않는 패턴을 만듭니다 .
sed 's/[^0-9]*\([0-9]*\).*/^[^0-9]*\1[^0-9]*.*$/'
답변2
이런 종류의 작업에 join
매우 유용합니다 . 조인을 사용할 때 두 파일 모두 열을 기준으로 정렬되며 두 파일의 열이 동일하다는 점을 기억하세요.
이것이 해결책이다
sort -o file1 file1 #sort and save content of file1
sort -o file2 file2 #sort and save content of file2
join file1 file2
답변3
가능한 해결책 중 하나(빈 줄 확인):
while read line; do [ ${#line} -gt 0 ] && grep "$line" File2; done < File1
답변4
다음 명령을 사용하여 테스트하면 훌륭하게 작동합니다.
주문하다
프라빈@프라빈:~$awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2
산출
프라빈@프라빈:~$awk 'NR==FNR{a[$1];next}($1 in a){print $0}' file1 file2
99373 dhdhdhdhd, 3838 dheueie,aaaa
133838000 rrtyusbjsjs,382 djdjdjsusu