문자가 한 번만 포함된 줄을 삭제하는 방법

문자가 한 번만 포함된 줄을 삭제하는 방법

특정 문자가 한 번만 포함된 파일에서 줄을 삭제하고 해당 줄이 여러 번 나타나거나 존재하지 않는 경우 파일에 해당 줄을 유지하고 싶습니다.

예를 들어:

DTHGTY
FGTHDC
HYTRHD
HTCCYD
JUTDYC

여기서 제거하려는 문자는 C명령이 한 번만 행을 제거해야 하는 문자 FGTHDC입니다 .JUTDYCC

sed또는 을 사용하여 이 작업을 어떻게 수행할 수 있습니까 awk?

답변1

awk필드 구분 기호를 무엇이든 설정할 수 있습니다 . 로 설정하면 C+1만큼 필드가 발생합니다 C.

awk -F'C' '{print NF}' <<< "C1C2C3"따라서 다음과 같이 말하면 4: CCC에는 3 C초가 포함되므로 4개의 필드가 있습니다.

C한 번만 나타나는 행을 삭제하려고 합니다 . 이를 염두에 두고, 귀하의 경우 C정확히 두 개의 필드가 있는 행을 삭제해야 합니다 . 그러니 건너뛰세요:

$ awk -F'C' 'NF!=2' file
DTHGTY
HYTRHD
HTCCYD

답변2

sed방법:

sed -i '/^[^C]*C[^C]*$/d' input

-i옵션을 사용하면 내부 파일 수정이 가능합니다.

/^[^C]*C[^C]*$/C- 정확히 한 번만 포함된 행 일치

d- 일치하는 라인 삭제

답변3

이는 다음을 통해 수행할 수 있습니다 sed.

암호:

sed '/C.*C/p;/C/d' file1

결과:

DTHGTY
HYTRHD
HTCCYD

어떻게?

  1. C적어도 두 개의 via 복사본이 있는 라인을 일치시키고 인쇄합니다./C.*C/p
  2. Cvia 가 있는 모든 줄을 삭제합니다 /C/d. 여기에는 1단계에서 인쇄된 줄이 포함됩니다.
  3. 기본적으로 나머지 줄 인쇄

답변4

표준 출력으로 수정 사항을 인쇄하는 대신 파일을 편집하는 스크립트를 위한 POSIX 도구는 입니다 ex.

printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt

확신하는사용sed -iSed 버전이 이를 지원하는 경우 다른 유형의 시스템에서 실행되도록 설계된 스크립트를 작성하는 경우 이식성이 없다는 점에 유의하십시오.


David Foster는 댓글에서 다음과 같이 물었습니다.

printf사용하거나 사용하지 않거나 echo유사한 이유가 있습니까 ex -c COMMAND?

대답: 그렇습니다.

printfvs. 의 경우 echo이식성 문제입니다.왜 printf가 echo보다 나은가요? 그리고 명령 사이에 개행 문자를 퍼뜨리는 데에도 printf.

printf ... | exvs. 의 경우 ex -c ...이는 오류 처리에 관한 문제입니다. 이 특정 명령의 경우에는 중요하지 않지만 일반적으로 예를 들어 다음을 입력해 보십시오.

ex -c '%s/this pattern is not in the file/replacement text/g | x' filename

스크립트에서. 대조:

printf '%s\n' '%s/no matching lines/replacement/g' x | ex file

첫 번째는 정지하고 입력을 기다립니다. 명령이 EOF를 받으면 두 번째는 종료되어 ex스크립트가 계속됩니다. 예를 들어 다른 대체 해결 방법이 있지만 s///ePOSIX에서는 이를 지정하지 않습니다. 나는 위와 같이 휴대용 형식을 사용하는 것을 선호합니다.

명령 에는 g다음이 있습니다.~ 해야 하다마지막으로 개행 문자가 있는데, printf개행 문자를 작은따옴표로 묶는 대신 명령을 래핑하는 것을 선호합니다.

관련 정보