파일을 반복하면서 두 줄을 비교하여 동일한 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
\1
D
P
D
$ 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