텍스트 파일의 여러 줄을 고정 패턴으로 바꾸기

텍스트 파일의 여러 줄을 고정 패턴으로 바꾸기

좋습니다. 빠른 방법을 찾고 있습니다. 텍스트 데이터 파일에 변경해야 할 줄 번호 목록이 있습니다. 라인의 16비트 모드는 무엇이든 될 수 있지만 XXXXXXXXXXXXXXXX라인 번호에 따라 읽기만 가능 하도록 변경해야 합니다 . 다시 한 번 변경해야 할 줄 번호의 긴 목록이 있습니다. 변경해야 할 선에는 명확한 패턴이 없습니다. (데이터 스키마를 작성하지는 않았지만 모든 데이터를 읽으려면 어떤 행을 변경해야 하는지 알고 있습니다.

아직 명확하지 않다면 다른 방법으로 설명하겠습니다.

파일의 26115, 32198, 37256, 40001, 40023 행을 읽도록 변경합니다 XXXXXXXXXXXXXXX. 190만 행 파일에서 변경할 행이 100,000개가 넘습니다.

답변1

@Gilles의 답변에 대한 확장으로 파일에 변경해야 할 줄 번호가 있다고 말했기 때문에 (정렬되고 호출되었다고 가정합니다 linums)

awk '
  BEGIN { getline NEXT < "linums" }
  NR == NEXT { $0 = "XXXXXXXXXXXXXXX"; getline NEXT < "linums" }
  1
'

이는 수천 개의 줄 번호를 수동으로 입력할 필요 없이 수천 개의 줄을 변경하는 데 적합합니다.

또는 약간만 수정하면 변경하려는 줄 번호나 파일을 얻을 수 있습니다 stdin. 이에 대한 스크립트를 만들겠습니다. (이라고 부르겠습니다 redact.awk)

#!/usr/bin/awk -f
BEGIN {
    LINUMS = ARGV[1]
    ARGV[1] = ARGV[2]
    --ARGC
    getline NEXT < LINUMS
}
NR == NEXT {
    $0 = "XXXXXXXXXXXXXXX"
    getline NEXT < LINUMS
}
1

그런 다음 다음 중 하나를 사용할 수 있습니다.

$ ./redact.awk linums file-to-be-changed
$ ./redact.awk - file-to-be-changed
$ ./redact.awk linums -
$ ./redact.awk linums

(후자의 두 개는 동일합니다)

답변2

sed나 awk 모두 이 작업을 잘 수행할 수 있습니다.

sed '
    26115 s/.*/XXXXXXXXXXXXXXX/
    32198 s/.*/XXXXXXXXXXXXXXX/
    37256 s/.*/XXXXXXXXXXXXXXX/
    40001 s/.*/XXXXXXXXXXXXXXX/
    40023 s/.*/XXXXXXXXXXXXXXX/
'
awk '
  NR==26115 || NR==32198 || NR==37256 || NR==40001 || NR==40023 {$0 = "XXXXXXXXXXXXXXX"}
  1
'

1(이전 코드가 가능한 모든 변환을 수행한 후 모든 줄이 개별적으로 인쇄됩니다.)

답변3

sed -e '1{x;s/^/XXXXXXXXXXXXXXX/;x;}
   26115bp
   32198bp
   37256bp
   40001bp
   40023bp
   d
   :p
   g
' data_file

먼저 예약된 공간을 필수 패턴으로 채운 다음 XXXXXXXXX 예약된 공간을 검색한 다음 암시적으로 표준 출력으로 전송하는 레이블 :p로 점프하여 필요한 줄 번호만 호출합니다. 일치하지 않는 행은 삭제됩니다( d계속하려면 으로 변경).b

답변4

에서는 교체가 정적이고 여러 줄을 교체하는 것이 매우 간단하므로 작업을 수행하기 위한 대규모 스크립트를 sed만들 수 있습니다 .sed

줄 번호를 한 줄에 하나씩 별도의 파일에 넣는다고 가정하면 다음 과 같이 (GNU) 스크립트를 생성 linenos.txt할 수 있습니다 .sed

$ awk '{ printf("%dc XXXXXXXXXXXXXXX\n", $0) }' linenos.txt >script.sed

또는

$ awk '{ print $0, "c XXXXXXXXXXXXXXX" }' linenos.txt >script.sed

그런 다음 파일에 적용합니다.

$ sed -f script.sed file >file.new

참고: 저는 매우 큰 스크립트를 실행한 적이 없기 때문에 GNU가 성능 측면에서 스크립트를 sed어떻게 처리하는지 모르겠습니다 .sed

관련 정보