누구든지 텍스트 파일에서 두 연속 줄의 첫 번째 문자를 비교하고 첫 번째 문자가 모두 동일한 경우 두 번째 줄을 무시/제거하고 첫 번째 줄만 새 파일에 인쇄하는 방법을 도울 수 있습니까?
#1001
#1002
mango
orange
grape
#1003
을(를) 삭제하고 싶습니다 #1002
.
답변1
uniq
GNU 및 -w
옵션 1 사용 :
-w, --check-chars=N
compare no more than N characters in lines
연속적으로 반복되는 줄을 생략하고 첫 번째 문자만 비교할 수 있습니다.
uniq -w1 infile >outfile
1. 멀티바이트 문자에서는 제대로 작동하지 않습니다. 아래 Stéphane의 메모를 참조하세요.
답변2
perl -C -ne '$c = substr($_,0,1);
print unless $c eq $l;
$l = $c;' < file.in > file.out
답변3
sed '$n;h;N;/^\(.\).*\n\1/g;/\n/P;//!G;D' <in >out
sed
이를 수행할 수 있는 스크립트 가 있습니다 .
작동 방식은 다음과 같습니다.
- 현재 줄이 마지막 줄이면 표준 출력으로 인쇄하고 스크립트를 종료합니다.
- 그렇지 않은 경우 현재 행의 복사본을 저장하여 공간을 보존하세요.
- 그런 다음 다음 입력 라인을 패턴 공간에 추가합니다.
- 패턴 공간의 첫 번째 문자가 방금 추가된 줄의 첫 번째 문자와 동일한 경우 예약된 공간의 저장된 복사본으로 패턴 공간을 덮어씁니다.
- 그렇지 않다면 패턴 공간에 여전히 선이 있을 것이고
\n
, 이 경우 해당 지점까지 인쇄해야 합니다. - 그렇지 않은 경우 패턴 공간에 보관한 행의 또 다른 복사본을 추가합니다.
- 어쨌든, 패턴 공간에서 첫 번째 개행 문자를 제거하고 나머지는 스크립트 상단부터 시작하도록 유지하세요.
기본적으로 한 번에 두 줄을 작업하여 두 번째 줄의 첫 번째 문자가 첫 번째 줄의 첫 번째 문자와 일치하지 않을 때 첫 번째 줄만 인쇄하고 동일한 문자로 시리즈의 첫 번째 문자를 재귀적으로 덮어씁니다. 따라서 최소한의 버퍼링으로 모든 크기의 입력을 빠르고 효율적으로 처리할 수 있으며, 모든 크기의 첫 번째 문자 일치 계열을 첫 번째 발생으로 압축할 수 있습니다. 실시간 입력이나 파일을 사용하지만 현재 줄과 다음 줄의 복사본을 읽거나 저장하기만 하면 됩니다.
답변4
perl -0777 -pe '1 while s/^(.)(.*)\n\1.*/$1$2/gm' file.in >file.out
이것은 더 이상 일치하는 항목이 발견되지 않을 때까지 전체 파일을 먹고 반복합니다.