file1.txt
두 개의 파일 이 있고 file2.txt
.
file1.txt
4000줄의 단일 문자열 단어가 있고 498 file2.txt
개의 문장이 있습니다.
나는 그 안에 내용을 원 하고 해당 문자열이 grep
file2
print match 에서 발견 되면 원합니다.file1
file1
file2
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
file1
as에 빈 줄이 있는지 확인하고 , 그렇다면 해당 줄에 포함된 빈 문자열은 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에서만 찾을 수 있습니다.file1
file2
<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>
file1
UTF-16BE 인코딩에는 0x00 0x61 0x00 0x62 0x00 0x63 0x00 0x0a 바이트가 포함되며, Unix의 경우 NUL 입력을 지원하도록 업데이트되지 않은 C로 작성된 구현은 버퍼로 라인을 읽습니다 <NUL>a<NUL>b<NUL>c<NUL><newline>
. grep
C 문자열로 처리되며 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을 차단하지 않는 구현을 사용하더라도 grep
UTF-16으로 인코딩된 경우 모든 줄에서 일치 항목을 얻을 수 있습니다.file2
file2
다음 명령을 사용하여 파일에 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 파일인 경우 dos2unix
MS Windows 파일과 관련된 다른 모든 문제를 해결하는 것 외에도 UTF-16에서 변환할 수 있습니다. UTF-16LE 또는 UTF-16BE의 경우 무언가를 전달 --assume-utf16le
하거나 --assume-utf16be
그것이 무엇인지 알려주어야 합니다.
답변3
문제는 문자열에 SS가 포함된 파일에 있습니다. 이는 모든 것을 선택합니다.