파일에서 두 개의 연결된 중복 줄을 찾는 방법은 무엇입니까?
예를 들어, 이 파일에는 두 개의 연결된 반복 줄만 있습니다.
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter <--
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter <--
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
답변1
Uniq이면 충분합니다.
$ cat c.txt
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
$ uniq -D c.txt
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
$ uniq c.txt
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.ear
OQ-63/ECC/Global/MES/CZ/adWerum-CZ-Adapter
OQ-63/ECC/Global/MES/54/ECC-MRP-S05.xml
기본적으로 uniq는 입력 파일의 인접한 행을 확인합니다. 따라서 정렬되지 않은 파일의 경우(예: 귀하의 경우) uniq는 원하는 작업을 수행합니다.
uniq -d 및 -u 옵션에도 관심이 있을 수 있습니다. 자세한 내용은 매뉴얼 페이지를 참조하십시오(-d는 두 개의 중복 행 중 하나만 인쇄하고 -u는 uniq 행만 인쇄 - 두 중복 항목을 모두 제거합니다).
답변2
또 다른 옵션:
grep -zPo '\n(.+)\n\1\n'
이렇게 하면 추가 조정 사항(예: 추가 공간 허용 등)을 추가할 수 있습니다.
업그레이드: @thor가 지적했듯이 파일 시작 부분에서 중복을 포착하지 않습니다. 이 상황을 해결하려면 다음을 사용하십시오.
grep -zPo '(?<!.)(.+\n)\1'
답변3
AWK의 또 다른 대안:
awk 'x !~ $0; {x=$0}'
이렇게 하면 uniq와 동일한 동작을 얻을 수 있지만 열 단위로도 마찬가지입니다.
awk -F/ 'x !~ $2; {x=$2}'
-F
필드 구분자를 설정합니다.
이렇게 하면 두 번째 필드가 이전 행의 두 번째 필드와 연속적으로 동일한 행을 삭제할 수 있습니다.
$ cat c.txt
line/one
line/two
otherline/two
yetanotherline/two
line/three
$ awk -F/ 'x !~ $2; {x=$2}' c.txt
line/one
line/two
line/three