Perl 스크립트는 연속된 두 줄의 첫 번째 문자를 비교하고 첫 번째 두 문자가 동일하면 두 번째 줄을 무시합니다.

Perl 스크립트는 연속된 두 줄의 첫 번째 문자를 비교하고 첫 번째 두 문자가 동일하면 두 번째 줄을 무시합니다.

누구든지 텍스트 파일에서 두 연속 줄의 첫 번째 문자를 비교하고 첫 번째 문자가 모두 동일한 경우 두 번째 줄을 무시/제거하고 첫 번째 줄만 새 파일에 인쇄하는 방법을 도울 수 있습니까?

#1001
#1002
mango
orange
grape
#1003

을(를) 삭제하고 싶습니다 #1002.

답변1

uniqGNU 및 -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이를 수행할 수 있는 스크립트 가 있습니다 .

작동 방식은 다음과 같습니다.

  1. 현재 줄이 마지막 줄이면 표준 출력으로 인쇄하고 스크립트를 종료합니다.
  2. 그렇지 않은 경우 현재 행의 복사본을 저장하여 공간을 보존하세요.
  3. 그런 다음 다음 입력 라인을 패턴 공간에 추가합니다.
  4. 패턴 공간의 첫 번째 문자가 방금 추가된 줄의 첫 번째 문자와 동일한 경우 예약된 공간의 저장된 복사본으로 패턴 공간을 덮어씁니다.
  5. 그렇지 않다면 패턴 공간에 여전히 선이 있을 것이고 \n, 이 경우 해당 지점까지 인쇄해야 합니다.
  6. 그렇지 않은 경우 패턴 공간에 보관한 행의 또 다른 복사본을 추가합니다.
  7. 어쨌든, 패턴 공간에서 첫 번째 개행 문자를 제거하고 나머지는 스크립트 상단부터 시작하도록 유지하세요.

기본적으로 한 번에 두 줄을 작업하여 두 번째 줄의 첫 번째 문자가 첫 번째 줄의 첫 번째 문자와 일치하지 않을 때 첫 번째 줄만 인쇄하고 동일한 문자로 시리즈의 첫 번째 문자를 재귀적으로 덮어씁니다. 따라서 최소한의 버퍼링으로 모든 크기의 입력을 빠르고 효율적으로 처리할 수 있으며, 모든 크기의 첫 번째 문자 일치 계열을 첫 번째 발생으로 압축할 수 있습니다. 실시간 입력이나 파일을 사용하지만 현재 줄과 다음 줄의 복사본을 읽거나 저장하기만 하면 됩니다.

답변4

perl -0777 -pe '1 while s/^(.)(.*)\n\1.*/$1$2/gm' file.in >file.out

이것은 더 이상 일치하는 항목이 발견되지 않을 때까지 전체 파일을 먹고 반복합니다.

관련 정보