중복된 필드만 찾아 인쇄

중복된 필드만 찾아 인쇄
Address                  HWtype  HWaddress           Flags Mask       Iface
192.168.142.223          ether   00:50:56:f5:0a:e7   C                     eth0
192.168.142.254          ether   00:50:56:f5:0a:z7   C                     eth0
192.168.142.253          ether   00:50:56:f5:0a:w7   C                     eth0
192.168.142.230          ether   00:50:56:f5:0a:dc   C                     eth0
192.168.142.249          ether   00:50:56:f5:0a:b7   C                     eth0
192.168.142.252          ether   00:50:56:f5:0a:d8   C                     eth0
192.168.142.254          ether   00:50:56:f5:0a:a1   C                     eth0
_gateway                 ether   00:50:56:f0:dd:44   C                     eth0

나는 이와 같은 텍스트 파일을 가지고 있으며 내 의도는 첫 번째 필드와 함께 동일한 파일을 인쇄하는 것입니다.

예를 들어

 192.168.142.254          ether   00:50:56:f5:0a:z7   C     eth0
 192.168.142.254          ether   00:50:56:f5:0a:a1   C     eth0

내 해결책은 이것입니다.

 1- cat a |awk '{print $1," ",$3}' |grep $(cat a |awk '{print $1}' |sort |uniq -d) 
 2- cat a |awk '{print $3," ",$1}' |sort -k 2|uniq -f 1 -D

그래서 궁금한데 다른 방법은 없을까요? (아마도 그냥 awk 명령을 사용할 수도 있습니다.) 저는 단지 bash 명령을 사용하고 싶습니다.

답변1

모든 UNIX 시스템의 모든 쉘에서 awk를 사용하고 다음을 입력하십시오.

$ awk 'NR==FNR{cnt[$1]++; next} cnt[$1]>1' file file
192.168.142.254          ether   00:50:56:f5:0a:z7   C                     eth0
192.168.142.254          ether   00:50:56:f5:0a:a1   C                     eth0

답변2

이 시도,

grep "^$(awk 'seen[$1]++ == 1 {print $1}' a)\b" a
192.168.142.254          ether   00:50:56:f5:0a:z7   C                     eth0
192.168.142.254          ether   00:50:56:f5:0a:a1   C                     eth0

또는

grep "^$(awk 'seen[$1]++ == 1 {gsub(/\./,"\\."); print $1}' a)\b" a

관련 정보