"grep -Ff file1 file2"는 file1의 단어가 포함된 줄 대신 file2의 모든 줄을 인쇄합니다.

"grep -Ff file1 file2"는 file1의 단어가 포함된 줄 대신 file2의 모든 줄을 인쇄합니다.

file1.txt두 개의 파일 이 있고 file2.txt.

file1.txt4000줄의 단일 문자열 단어가 있고 498 file2.txt개의 문장이 있습니다.

나는 그 안에 내용을 원 하고 해당 문자열이 grep file2print match 에서 발견 되면 원합니다.file1file1file2

grep -f시도해 보았지만 grep -Ff파일의 내용만 인쇄하는 것뿐입니다.

파일 1.txt

something
somthingelse
maybe
ok
yes

파일 2.txt

Hello there how are you
Here is another line ok
Nothing to see here maybe
Nope not here
yes 

예상 출력

Here is another line ok
Nothing to see here maybe
yes



 wc -l file1.txt file2.txt
 4000 file1.txt
  498 file2.txt
 4498 total

답변1

file1as에 빈 줄이 있는지 확인하고 , 그렇다면 해당 줄에 포함된 빈 문자열은 as의 모든 줄과 일치합니다 file2. 거기에 빈 줄이 있습니다file1

$ cat file1
something
somthingelse
maybe

ok
yes

$ grep -Ff file1 file2
Hello there how are you
Here is another line ok
Nothing to see here maybe
Nope not here
yes

yes단일 공백 ​​문자를 포함하는 줄은 위의 입력이 주어진 줄과 아직 일치하지 않는 모든 줄과 일치하는 것과 동일한 출력을 생성합니다.

두 파일이 모두 CRLF 구분 기호(CSV와 공통)가 있는 MSDOS 텍스트 형식인 경우 해당 CR 문자에 대해 한 줄만 있습니다(MSDOS/Windows에서는 빈 줄, Unix에서는 제어 문자 OK). 목적.

다음을 사용하기 전에 빈 줄이나 빈 줄을 필터링할 수 있습니다 file1.

grep '[^[:space:]]' file1 | grep -Ff - file2

MSDOS 파일인 경우 해당 CR을 제거할 수도 있습니다. file1그렇지 않으면 word<CR>줄 끝의 if에서만 찾을 수 있습니다.file1file2

<file1 dos2unix | grep '[^[:space:]]' | grep -Ff - file2

답변2

Ed가 언급한 빈/빈 줄 및 CRLF 문제 외에도 이 문제는 파일에 NUL 바이트가 있는 경우에도 발생할 수 있습니다 file1. 예를 들어 파일이 UTF-16 또는 UTF-16LE/UTF-16BE로 인코딩되어 있고 grep입력에 NUL을 지원하지 않습니다(Unix의 텍스트 파일은 NUL 바이트를 포함할 수 없고 UTF-16으로 인코딩된 텍스트는 텍스트 유틸리티로 처리할 수 없으며 UTF-16은 Unix 로케일에서 사용되는 코드 세트가 될 수 없습니다).

예를 들어 abc<newline> file1UTF-16BE 인코딩에는 0x00 0x61 0x00 0x62 0x00 0x63 0x00 0x0a 바이트가 포함되며, Unix의 경우 NUL 입력을 지원하도록 업데이트되지 않은 C로 작성된 구현은 버퍼로 라인을 읽습니다 <NUL>a<NUL>b<NUL>c<NUL><newline>. grepC 문자열로 처리되며 C 문자열은 NUL로 구분되므로 빈 문자열로 처리됩니다.

비지박스를 예로 들어보겠습니다 grep.

$ echo abc | iconv -t UTF-16BE | busybox grep -Ff - <(echo whatever)
whatever

UTF-16LE(0x61 0x00 0x62 0x00 0x63 0x00 0x0a 0x00)로 인코딩하면 두 번째 줄에는 NUL만 포함되어 있다고 생각하는 것과 같습니다.

이 경우 NUL을 차단하지 않는 구현을 사용하더라도 grepUTF-16으로 인코딩된 경우 모든 줄에서 일치 항목을 얻을 수 있습니다.file2file2

다음 명령을 사용하여 파일에 NUL이 포함되어 있는지 확인할 수 있습니다.

tr -cd '\0' < file1 | wc -c

그것은 그들에게 달려 있습니다. od -vAd -tc -tx1 | head예를 들어 처음 몇 바이트의 값을 보면 UTF-16으로 인코딩되었는지 여부를 알 수 있습니다.

  • 정상:

    $ echo abc | od -vAd -tc -tx1 | head
    0000000   a   b   c  \n
             61  62  63  0a
    0000004
    
  • UTF-16(BOM 포함):

    $ echo abc | iconv -t UTF-16 | od -vAd -tc -tx1 | head
    0000000 377 376   a  \0   b  \0   c  \0  \n  \0
             ff  fe  61  00  62  00  63  00  0a  00
    0000010
    
  • UTF-16LE(리틀 엔디안):

    $ echo abc | iconv -t UTF-16LE | od -vAd -tc -tx1 | head
    0000000   a  \0   b  \0   c  \0  \n  \0
             61  00  62  00  63  00  0a  00
    0000008
    
  • UTF-16BE(빅 엔디안)

    $ echo abc | iconv -t UTF-16BE | od -vAd -tc -tx1 | head
    0000000  \0   a  \0   b  \0   c  \0  \n
             00  61  00  62  00  63  00  0a
    0000008
    

iconv -f UTF-16LE < file1.csv > file1.unix.csv예를 들어 다음을 사용하여 문제를 해결할 수 있습니다 .

MSDOS/Windows 파일인 경우 dos2unixMS Windows 파일과 관련된 다른 모든 문제를 해결하는 것 외에도 UTF-16에서 변환할 수 있습니다. UTF-16LE 또는 UTF-16BE의 경우 무언가를 전달 --assume-utf16le하거나 --assume-utf16be그것이 무엇인지 알려주어야 합니다.

답변3

문제는 문자열에 SS가 포함된 파일에 있습니다. 이는 모든 것을 선택합니다.

관련 정보