파일에서 부분 줄 일치를 제거하는 방법은 무엇입니까?

파일에서 부분 줄 일치를 제거하는 방법은 무엇입니까?

파일을 반복하면서 두 줄을 비교하여 동일한 12자로 시작하는지 확인하고 싶습니다. 이렇게 하면 첫 번째 줄을 삭제한 다음 모든 줄을 비교할 때까지 나머지 줄을 파일의 다음 줄과 비교하고 싶습니다.

이 파일에는 디렉터리에 있는 정렬된 파일 목록이 포함되어 있습니다. 동일한 12자로 시작하는 파일이 두 개 이상 있을 수 있습니다(항상 순서대로). 난 그냥 마지막 걸 원해

이전 게시물에서 비슷한 솔루션을 보았습니다.

sed '$!N; /\(.*\)\n\1:FOO/D; P;D' file

하지만 나에게 맞게 수정할 수는 없습니다.

답변1

시스템에 가 있는 경우 uniq-w n옵션을 사용하여 비교를 첫 번째로 제한 할 수 있습니다.N줄당 문자 수:

uniq -w 12 file.txt

이 반환됩니다첫 번째각 게임은 연속적으로 나타납니다.

네가 원한다면마지막각 일치 항목은 연속적으로 발생하며 처리 전후에 파일을 실행하여 tac줄 순서를 반대로 합니다 uniq.

tac file.txt | uniq -w 12 | tac

예:

[fish/]$ cat fish.txt
Apopterygion_alta.fasta
Apopterygion_oculus.fasta
Oncorhynchus_gorbuscha.fasta
Oncorhynchus_keta.fasta
Oncorhynchus_kisutch.fasta
Oncorhynchus_masou.fasta
Oncorhynchus_nerka.fasta
Oncorhynchus_tshawytscha.fasta
[fish/]$ uniq -w 12 fish.txt
Apopterygion_alta.fasta
Oncorhynchus_gorbuscha.fasta
[fish/]$ tac fish.txt | uniq -w 12 | tac
Apopterygion_oculus.fasta
Oncorhynchus_tshawytscha.fasta

답변2

그런 다음 다음 sed과 같이 조정했습니다.

sed '$!N; /^\(.\{12\}\).*\n\1/D; P;D'

마지막( $!)을 제외한 모든 줄에서 다음 줄( N)을 로드한 다음 패턴 버퍼에서 반복되는 12자를 찾습니다(줄의 시작 부분에서 12자를 ^캡처한 다음 줄 바꿈 이 뒤에 오는 모든 항목과 일치하고 캡처된 그룹) 다시 ), 발견되면 버퍼의 첫 번째 라인( )을 삭제한 다음 버퍼의 (나머지) 첫 번째 라인을 인쇄( )하고 삭제( )합니다.\(\).\{12\}.*\n\1DPD

$ cat test
foo
barbarbarbar123
barbarbarbar456
doo
$ sed '$!N; /^\(.\{12\}\).*\n\1/D; P;D'  < test
foo
barbarbarbar456
doo

또한 매우 간단합니다 awk.

$ awk 'NR != 1 && substr($0, 0, 12) != substr(p, 0, 12) {print p} 
     {p=$0} END {print p}' < test
foo
barbarbarbar456
doo

현재 줄의 처음 12자를 첫 번째 줄( ) NR != 1을 제외한 다른 모든 줄의 $0문자열과 비교하여 p서로 다른 경우 인쇄합니다 p. 그런 다음 p현재 행으로 설정합니다 . 어쨌든 인쇄 하세요 END.p

관련 정보