Linux에서 목록 출력을 grep에 대한 입력으로 사용하는 방법은 무엇입니까?

Linux에서 목록 출력을 grep에 대한 입력으로 사용하는 방법은 무엇입니까?

나는table_1

A D G
B E H
C F I

awk '{print $1}' table_1다음 명령을 사용하여 위 표의 열 1을 인쇄합니다.list_1

A
B
C

list_1위의 내용을 grep -f사용 하고 싶습니다 .table_2

A n m
B m n
C n m
D m n
E n m

얻기 위해table_3

A n m
B m n
C n m

하지만 저장하지 않고 한 줄의 코드를 사용하여 이 작업을 수행하고 싶습니다 list_1.

명령을 어떻게 구성합니까?

답변1

사소한 (그러나아니요bash 관련) 변경 사항사이러스의 코멘트:

awk '{print $1}' table_1 | grep -f - table_2

광범위한 규칙(예: 파일 이름)을 사용합니다.- "표준 입력에서 읽음"을 의미합니다.

답변2

사용 awk:

awk 'NR==FNR{a[$1];next} ($1 in a)' table_1 table_2

답변3

이를 사용하는 또 다른 방법이 있습니다 join. 파일이 정렬되어 있고 table_2실제로 세 개의 열만 있는 경우 다음을 사용할 수 있습니다.

join -o "2.1 2.2 2.3" table_1 table_2 > table_3

~처럼쿠사라난다 라고join첫 번째 파일의 열 값과 두 번째 파일의 열 값을 일치시켜 두 파일을 결합하도록 설계된 프로그램 입니다 . 기본적으로 각 파일의 첫 번째 열이 사용되는 경우(이를 재정의할 수 있음) 기본적으로 다음과 같이 일치하는 줄을 결합합니다.

$ join table_1 table_2
A D G n m
B E H m n
C F I n m

-o "2.1 2.2 2.3""두 번째 파일의 첫 번째 필드를 출력하고, 두 번째 파일의 두 번째 필드를 출력한 다음, 두 번째 파일의 첫 번째 1/3을 출력합니다( 첫 번째 파일 1 라고 되어 있습니다 . 불행하게도 여기에는 단축키, 약어, 액셀러레이터 또는 와일드카드가 없는 것 같습니다. "두 번째 파일에서 전체 줄을 출력합니다"라고 말할 수 있는 방법은 없습니다. 두 번째 파일에 필드가 많으면 -o형식이 매우 길어야 합니다.

이는 기반 솔루션 grep(귀하의 및내 거) table_1 1열의 값을 1열의 값과 구체적으로 일치시키고 table_22열이나 3열의 행이나 1열의 행을 제공하지 않기 때문입니다. table_2 와 마찬가지로 ( ) 옵션이 인식되므로 의 첫 번째 줄이 소문자인 경우 지정한 경우에만 출력에 해당 줄이 표시됩니다. ________ 1첫 번째 파일의 첫 번째 필드를 제외하고 - 두 번째 파일의 첫 번째 필드와 동일합니다.AAZjoingrep-i--ignore-casetable_2a n matable_3-i

답변4

bash두 테이블이 모두 첫 번째 열에 정렬되어 있다고 가정하고 ksh93프로세스 대체를 이해하기 위해 or 와 같은 셸을 사용합니다 <(...).

$ join <( awk '{ print $1 }' table_1 ) table_2
A n m
B m n
C n m

테이블이아니요정렬 후에는 정렬해야 합니다.

$ join <( awk '{ print $1 }' table_1 | sort ) <( sort table_2 )
A n m
B m n
C n m

유틸리티가 join실행됩니다.관계형 INNER JOIN 연산(기본적으로) 제공한 두 파일의 첫 번째 열에 있습니다.

생성할 새 파일로 출력을 리디렉션합니다 table_3.

$ join <( awk '{ print $1 }' table_1 | sort ) <( sort table_2 ) >table_3

관련 정보