나는 FILE1이 file2의 두 단어가 file1의 목록에 속하는 file2. 그래서 표시해야합니다 :는
노란색 망고
내가 시도 : 나는 구문 오류를 얻고있다
awk < file2 '{if [grep -q $1 file1] && [grep -q $2 file1]; then print $0; fi}'
.
나는 FILE1이 file2의 두 단어가 file1의 목록에 속하는 file2. 그래서 표시해야합니다 :는
노란색 망고
내가 시도 : 나는 구문 오류를 얻고있다
awk < file2 '{if [grep -q $1 file1] && [grep -q $2 file1]; then print $0; fi}'
.
이 트릭을 할 것입니다 :
$ 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}
이므로 암시 적입니다.
당신은 배쉬, 나오지도 다른 명령어를 수행 할 수 있습니다
grep -f <(sed 's/^/^/' file1) file2 | grep -f <(sed 's/$/$/' file1)
이 조금 모호한, 그래서 그것을 무너 뜨리는 것입니다
grep -f <file>
파일에서 패턴의 시퀀스를 읽고 것이다 그 (것)들에 성냥.
<(...)
은 bash
process substitution이고 쉘 명령을 실행하고 파일 이름 대신 사용할 수있는 출력을 가진 의사 파일을 만듭니다.
sed 's/^/^/' file1
은 file1의 각 행의 시작 부분에 문자를 삽입하여 파일 2의 첫 번째 단어와 일치하는 패턴을 만듭니다.
sed 's/$/$/' file1
은 끝에 $
문자를 삽입하므로 패턴이 두 번째 단어와 일치합니다.
편집 : 사용 :
grep -f <(sed 's/^/^/;s/$/\b/' file1) file2 | grep -f <(sed 's/$/$/;s/^/\b/' file1)
조나단은 자신의 의견에서 지적하는 문제를 피해 갈 수 있습니다.
두 번째 파일의 행이 'greengage earthapple'이라면 그 행의 시작 부분에 '녹색'이 표시되고 끝에 'apple'과 일치하므로 명령이 실행됩니다. 선. –
이것은 매우 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
참고.
감사합니다. 그것은 훌륭합니다 ... 당신이 그것을 무너 뜨리고 어떻게 작동 하는지를 설명 할 수 있다면 매우 도움이 될 것입니다. – TransientFringe
@ user2312196 설명을 추가했습니다. –
대단히 감사합니다 – TransientFringe