grep
한 파일 실행의 여러 줄 출력을 다른 파일의 후속 두 번째 실행 패턴 으로 사용할 수 있습니까 ?grep
예:
- 콘텐츠
file1.txt
2 blue 1 red 1 green 2 black 2 orange
- 콘텐츠
file2.txt
2 blue triangle 2 blue circle 3 blue triangle 2 red triangle 3 green circle 4 red square 2 orange circle 2 brown circle
- 첫 번째 결과
grep
:$ grep 2 file1.txt 2 blue 2 black 2 orange
이제 다음과 같은 명령을 찾고 있습니다.
grep <PREVIOUS OUTPUT> file2.txt
file2.txt
그러면 다음을 실행하여 생성된 줄 중 하나로 시작하는 모든 줄을 찾게 되므로 원하는 결과는 다음과 같습니다.grep
file1.txt
2 blue triangle
2 blue circle
2 orange circle
답변1
이것이 질문에 대한 답변입니다단어질문.이 작업을 더 잘 해결할 수 있는 답변을 보려면 awk
아래 "설명"의 솔루션을 참조하세요.
에서 발견된 패턴이 file1.txt
줄의 시작 부분에서만 발생할 수 있다고 가정하면 이 플래그를 사용하여 명령줄에서 정규식으로 선언하는 대신 파일에서 여러 검색 패턴을 읽을 file2.txt
수 있습니다 . -f
그런 다음 이 파일을 첫 번째 실행의 출력에 연결해야 합니다 grep
.
한 가지 방법은프로세스 교체:
grep -F -w -f <(grep -w 2 file1.txt) file2.txt
- 이
<( ... )
구성은 대괄호로 묶인 명령의 출력을 마치 파일인 것처럼 사용할 수 있게 만듭니다. - 이
-F
플래그는 전체 정규식 검색을 비활성화하고grep
첫 번째 실행의 출력에 정규식 컨텍스트에서 특별한 의미를 갖는 문자가 포함될 수 있는 경우를 대비한 안전 예방 조치입니다. 또한 리터럴 문자열 비교가 정규식 일치보다 빠르기 때문에 일치 속도도 빨라집니다. - 이
-w
플래그를 사용하면 부분적으로 일치하는 항목이 결과에 입력되지 않습니다. 예를 들어 의 첫 번째 열에 여러 숫자가 포함될 수 있는grep
경우 첫 번째 실행에 특히 바람직합니다 .file1.txt
12
고쳐 쓰다
@Stéphane Chazelas가 지적했듯이 이 옵션은 프로그램의 를 참조하기 -f
위해 종종(항상은 아니지만) 구현된 값을 허용 하므로 다음과 같이 작성할 수도 있습니다.-
stdin
grep -w 2 file1.txt | grep -F -w -f - file2.txt
다른 명령의 출력을 읽으려면 보다 쉽게 식별할 수 있는 파이프 방법을 사용하십시오.
노트
이는 패턴이
number color
의 처음 두 열로만 나타날 수 있다고 가정합니다file2.txt
. 나중에 같은 라인에서 일어날 수도 있다면4 red square and 2 blue triangle
이러한 줄은 일치하는 것으로 잘못 식별됩니다.
표 형식 데이터로 작업하는 경우(여기서 그런 것 같습니다)
awk
일반적으로 이 도구가 더 적절한 도구입니다. 귀하의 작업은 다음 절차를 통해 수행될 수 있습니다awk
.awk -v num="2" 'NR==FNR{if ($1==num){col[$2]}; next} ($1==num) && ($2 in col)' file1.txt file2.txt
그러면 두 파일이 모두 처리됩니다. 검색 키워드는
awk
변수를 통해 지정됩니다num
.첫 번째 파일을 처리할 때(
NR
전역 행 카운터가FNR
파일별 행 카운터와 동일함) 두 번째 열에 색상을 등록합니다.배열의 인덱스에서col
col[$2]
(따라서 첫 번째 열의 숫자가 일치하면 실제로 아무것도 할당되지 않습니다.) 그런 다음 다음 실행 줄로 점프합니다.두 번째 파일을 처리할 때 첫 번째 열이 변수와 일치하는지
num
, 두 번째 열이 배열의 인덱스에 있는지 확인합니다col
. 그렇다면 해당 행을 인쇄하십시오.
답변2
해결됨:
$ grep 2 file1.txt | xargs -I{} grep {} file2.txt
2 blue triangle
2 blue circle
2 orange circle