awk는 2K줄 이상의 내용이 포함된 파일을 처리할 수 없습니다.

awk는 2K줄 이상의 내용이 포함된 파일을 처리할 수 없습니다.

awk를 사용하여 파일의 줄을 변경합니다.

export textContent="verylongtextmorethan4K"

awk '{ if (NR == 200) print "${textContent}\"; else print $0}' a.txt  > b.txt

그러나 행 텍스트 길이가 2K를 초과하면 작동하지 않습니다. 삽입되는 텍스트가 너무 길기 때문이라는 것을 깨달았습니다. 4K 긴 텍스트를 한 줄에 삽입하려면 이 문제를 어떻게 해결해야 합니까?

답변1

Perl에서는 그러한 제한이 없도록 설계되었습니다.

#!/usr/bin/perl

while (<>) {
    if ($. == 200) {
        print $ENV{'textContent'}, "\n";
    }
    else {
        print;
    }
}

또는 짧은 "oneliner" 버전:

#!/usr/bin/perl
while (<>) { print ($. == 200) ? ($ENV{'textContent'} . "\n") : $_; }

예를 들어 Perl 스크립트를 저장 x.pl하고 실행하십시오.

perl x.pl a.txt > b.txt

또는 먼저 스크립트를 실행 가능하게 만듭니다.

chmod +x x.pl
./x.pl a.txt > b.txt

<>입력의 다음 줄을 반환하고 EOF에서 false를 반환하므로 루프가 종료됩니다.

$.현재 입력 줄 번호를 포함하는 Perl의 특수 변수입니다.

printPerl은 인수로 전달된 항목에 자동으로 줄바꿈을 추가하지 않기 때문에 "\n"첫 번째 버전에서는 print환경 변수의 내용과 줄바꿈이 목록으로 전달되었으므로 쉼표가 사용되었습니다. 두 번째 버전에서는 삼항 연산자( ? :)가 목록이 아닌 값을 기대하기 때문에 함께 연결됩니다.

어쩌면 당신은 삼항 연산자에 익숙하지 않을 수도 있습니다. 다음과 같은 형식을 취합니다.

condition ? value1 : value2

조건이 true이면 을 반환하고, 그렇지 않으면 를 value1반환합니다 value2. 따라서 여기서 줄 번호가 200이면 매우 긴 줄이 반환되고, 그렇지 않으면 $_현재 레코드(즉, 줄)의 내용이 반환됩니다.

관련 정보