두 개의 파일이 있습니다. 해당 파일을 123.txt
and 이라고 부르겠습니다 789.txt
. 123.txt
2.5M 라인 길이, 789.txt
65M 라인 길이. grep
또는 이와 유사한 789.txt
행을 포함하는 행을 유지하는 방법이 있습니까?123.txt?
에는 한 줄에 최대 한 개의 중복 항목이 있으며 789.txt
, 반복되는 텍스트는 줄의 시작 부분에 있습니다. 나는 완전히 막혔고 온라인에서 어떤 정보도 찾을 수 없어서 시작할 것이 아무것도 없습니다. 서버에서 실행되므로 시간이 좀 걸려도 괜찮습니다(그렇게 될 것이라는 것을 알고 있습니다).
123.txt:
hxxp://www.a.com hxxp://www.b.com hxxp://www.c.com
789.txt:
hxxp://www.a.com/kgjdk-jgjg/ hxxp://www.b.com/gsjahk123/ hxxp://www.c.com/abc.txt hxxp://www.d.com/sahgsj/
원하는 출력:
hxxp://www.a.com/kgjdk-jgjg/ hxxp://www.b.com/gsjahk123/ hxxp://www.c.com/abc.txt
답변1
다음을 사용하면 쉽게 이 작업을 수행할 수 있습니다 grep
.
$ grep -Ff 123.txt 789.txt
http://www.a.com/kgjdk-jgjg/
http://www.b.com/gsjahk123/
http://www.c.com/abc.txt
789.txt
위의 명령은 . -f가 포함된 파일을 인쇄합니다 123.txt
. -f는 "이 파일에서 검색할 패턴을 읽습니다"를 의미하고, -F는 검색 패턴을 기본 정규식 대신 문자열로 처리하도록 grep에 지시합니다.
123.txt
행에 후행 공백이 포함되어 있으면 작동하지 않으며 grep
공백은 패턴의 일부로 조회되며 단어 내에서 발생하면 일치하지 않습니다. 예를 들어 패턴 foo
(후행 공백 참고)은 일치하지 않습니다
foobar
. 파일에서 후행 공백을 제거하려면 다음 명령을 실행하십시오.
$ sed 's/ *$//' 123.txt > new_file
그런 다음 grep을 사용하십시오 new_file
.
$ grep -Ff new_file 789.txt
다음 플래그를 사용하면 새 파일을 사용하지 않고도 i
이 작업을 수행 할 수 있습니다.
$ sed -i.bak 's/ *$//' 123.txt
이렇게 하면 파일이 변경 123.txt
되고 123.txt.bak
.
(이 형태의 -i
플래그는 sed
GNU가 있다고 가정합니다 sed
. BSD sed
사용 의 -i .bak
경우 사이에 공백이 있습니다.)
답변2
귀하의 예와 같은 파일이 정렬되어 있고 항상 해당 패턴을 따르는 경우 다음과 같이 작성할 수 있습니다.
join -t/ -1 3 -2 3 123.txt 789.txt |
sed -n 's,\([^/]*/\)\([^/]*://\)\2,\2\1,p'
이것이 가장 효율적일 것입니다.