안녕하세요, 동일한 번호가 포함된 줄을 삭제하고 싶습니다. awk, sed 또는 perl에서 어떻게 이를 달성할 수 있습니까? 예를 들어 행 4와 5에는 모두 12.7이 포함되어 있으므로 이 두 행을 삭제하고 싶습니다. 감사해요.
입력 샘플
start=0.1
end=2.5
start=8.7
end=12.7
start=12.7
end=16.7
start=16.7
end=25.2
start=25.2
end=48.7
start=48.7
end=60.1
start=66.2
end=69.2
start=69.2
end=72.2
start=72.2
end=75.2
start=75.2
end=78.2
예상 출력:
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
답변1
GNU 구현을 사용 uniq
하고 입력에 탭 문자가 포함되어 있지 않다고 가정하면 다음을 수행할 수 있습니다.
<your-file tr = '\t' | uniq -uf1 | tr '\t' =
답변2
파일을 이중 으로 구문 분석 awk
하고 고유한 마지막 필드가 있는 행만 인쇄합니다.
$ awk -F= 'p==1{seen[$NF]++} p==2 && seen[$NF]==1' p=1 file p=2 file
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
또는 동일한 방법으로 고전적인 awk
관용구( FNR==NR
"첫 번째 파일을 읽을 때"를 의미함 next
)도 필요 합니다.
awk -F= 'FNR==NR {seen[$NF]++; next} seen[$NF]==1' file file
답변3
줄 번호(질문 독자를 위해 존재한다고 생각함)를 무시하면 기본적으로 연속 범위를 병합하려는 것 같습니다. 즉, end=X
start=Y
합계가 같은 숫자인 쌍을 제거합니다.X
Y
$ tr '\n' '\t' < file | sed 's/end=\([[:digit:].]*\)[[:blank:]]start=\1[[:blank:]]//g' | tr '\t' '\n'
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2
먼저 입력 데이터의 모든 개행 문자를 탭 문자로 바꾼 다음 기호 뒤의 동일한 숫자를 가진 모든 쌍을 sed
제거하는 데 를 사용하십시오 . 범위를 병합한 후 탭 문자는 다시 개행 문자로 대체됩니다.end=
start=
=
답변4
for i in `awk -F "=" '{if(!seen[$NF]++)print $NF}' file`; do p=`awk -F "=" -v i="$i" '$NF == i{print $0}' file|wc -l`;if [[ $p == 1 ]]; then awk -F "=" -v i="$i" '$NF == i{print $0}' file; fi; done
산출
start=0.1
end=2.5
start=8.7
end=60.1
start=66.2
end=78.2