awk 또는 sed를 사용하여 동일한 필드가 있는 경우 연속 레코드를 삭제하는 방법은 무엇입니까?

awk 또는 sed를 사용하여 동일한 필드가 있는 경우 연속 레코드를 삭제하는 방법은 무엇입니까?

안녕하세요, 동일한 번호가 포함된 줄을 삭제하고 싶습니다. 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합계가 같은 숫자인 쌍을 제거합니다.XY

$ 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

관련 정보