나는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_2
2열이나 3열의 행이나 1열의 행을 제공하지 않기 때문입니다. table_2
와 마찬가지로 ( ) 옵션이 인식되므로 의 첫 번째 줄이 소문자인 경우 지정한 경우에만 출력에 해당 줄이 표시됩니다. ________ 1첫 번째 파일의 첫 번째 필드를 제외하고 - 두 번째 파일의 첫 번째 필드와 동일합니다.A
AZ
join
grep
-i
--ignore-case
table_2
a n m
a
table_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