awkは、2K行以上の内容を含むファイルを処理できません。

awkは、2K行以上の内容を含むファイルを処理できません。

awkを使用してファイルの行を変更します。

export textContent="verylongtextmorethan4K"

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

ただし、行テキストの長さが2Kを超えると機能しません。挿入されるテキストが長すぎるために気づきました。 4K長いテキストを1行に挿入するには、この問題をどのように解決する必要がありますか?

答え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環境変数の内容と改行がリストに渡されたため、コンマが使用されました。 2番目のバージョンでは、三項演算子(? :)がリストではなく値を期待しているため、一緒にリンクされています。

たぶんあなたは三項演算子に慣れていないかもしれません。次の形式を取ります。

condition ? value1 : value2

条件がtrueの場合はを返し、そうでない場合はをvalue1返しますvalue2。したがって、ここで行番号が200の場合は非常に長い行が返され、それ以外の場合は$_現在のレコード(つまり行)の内容が返されます。

関連情報