2013-04-23 1 views
1

나는 FILE1이 file2의 두 단어가 file1의 목록에 속하는 file2. 그래서 표시해야합니다 :

노란색 망고

내가 시도 : 나는 구문 오류를 얻고있다

awk < file2 '{if [grep -q $1 file1] && [grep -q $2 file1]; then print $0; fi}' 

.

답변

3

이 트릭을 할 것입니다 :

$ awk 'NR==FNR{a[$0];next}($1 in a)&&($2 in a)' file1 file2 
yellow mango 

설명 :

NR 입력에서 특별한 awk 변수가 트랙 현재 행을하고 FNR 각 개별 파일에 현재 행을 추적하므로 조건 NR==FNR은 첫 번째 파일에있는 경우에만 true입니다. a은 키가 첫 번째 파일의 고유 한 줄인 연관 배열입니다. $0은 현재 행의 값이고 awk입니다. next 문이 skip의 다음 부분에 대한 파일의 다음 줄로 점프됩니다. 첫 번째 필드 $1이 배열 a에 있고 두 번째 필드가 현재 행을 인쇄하면 마지막 부분은 직선입니다. awk의 기본 블록은 {print $0}이므로 암시 적입니다.

+0

감사합니다. 그것은 훌륭합니다 ... 당신이 그것을 무너 뜨리고 어떻게 작동 하는지를 설명 할 수 있다면 매우 도움이 될 것입니다. – TransientFringe

+0

@ user2312196 설명을 추가했습니다. –

+1

대단히 감사합니다 – TransientFringe

0

당신은 배쉬, 나오지도 다른 명령어를 수행 할 수 있습니다

grep -f <(sed 's/^/^/' file1) file2 | grep -f <(sed 's/$/$/' file1) 

이 조금 모호한, 그래서 그것을 무너 뜨리는 것입니다

grep -f <file> 파일에서 패턴의 시퀀스를 읽고 것이다 그 (것)들에 성냥.

<(...)bashprocess substitution이고 쉘 명령을 실행하고 파일 이름 대신 사용할 수있는 출력을 가진 의사 파일을 만듭니다.

sed 's/^/^/' file1은 file1의 각 행의 시작 부분에 문자를 삽입하여 파일 2의 첫 번째 단어와 일치하는 패턴을 만듭니다.

sed 's/$/$/' file1은 끝에 $ 문자를 삽입하므로 패턴이 두 번째 단어와 일치합니다.

편집 : 사용 :

grep -f <(sed 's/^/^/;s/$/\b/' file1) file2 | grep -f <(sed 's/$/$/;s/^/\b/' file1) 

조나단은 자신의 의견에서 지적하는 문제를 피해 갈 수 있습니다.

+2

두 번째 파일의 행이 'greengage earthapple'이라면 그 행의 시작 부분에 '녹색'이 표시되고 끝에 'apple'과 일치하므로 명령이 실행됩니다. 선. –

0

이것은 매우 hackish 한 접근 방식이며 많은 grep/sed 구현 자의 눈살을 찌푸리게 할 것입니다. 또한 터미널에 따라 다를 수 있습니다. 당신은 경고를 받았습니다.

GNU grep은 색상 모드에서 패턴 중 하나와 일치하는 입력 부분을 강조 표시합니다. 이는 이론적으로 전체 일치 테스트를 위해 사용될 수 있습니다. 여기,이 경우에도 GNU의 도움으로, 즉, 실제로는 작동이 나오지 :

grep --color=always -f file1 file2 | sed -n '/^\x1b.*\x1b\[K *\x1b.*\x1b\[K$/ { s/\x1b\[K//g; s/\x1b[^m]*m//gp }' 

출력 : 나오지 패턴이 file2 공간 분리 컬럼을 가정합니다

yellow mango 

참고.