file1에 존재하는 file2에도 동일한 줄이 필요합니다.

file1에 존재하는 file2에도 동일한 줄이 필요합니다.

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하고 결과를 스키마 파일 grepFile2.

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

관련 정보