再帰的に繰り返されるテキスト行リストの作成 [閉じる]

再帰的に繰り返されるテキスト行リストの作成 [閉じる]

テキストファイルを拡張する方法:

元のテキストファイル:

1
2
3
4
5
etc

希望の拡張結果:

1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
etc.

つまり、ファイル 1 の最初の 5 行を新しい拡張ファイル 2 にリストし、n+1 から始めて 5 の 2 番目のブロックを追加し、n+2 で始まる 3 番目のブロックを追加するようにファイル 1 の最後まで続けますします。

ベストアンサー1

この行を一度だけ実行してください。

awk 'NR>5{printf"%s",out;sub("^[^\n]+\n","",out)}{out=out$0"\n"}END{printf "%s",out}' file
  1. もちろんfileファイル名に変更してください。

  2. awk入力を1行ずつ処理し、それに対して「動作」するプログラムです。

  3. out=out$0\n変数を作成し、out現在の行を変数に追加してから改行文字を追加します。

  4. NR>5{...}これは、行5より大きいレコード(行など)に対して中括弧内の操作を実行します。

  5. printf "%s", out変数を印刷しますout

  6. sub("^[^\n]+\n","",out)outここでは、最初の改行文字の先頭まで空の文字列に置き換える削除コマンドとして使用される代替コマンドです。

  7. 出力を2番目のファイルに保存するには、行のfile2最後に ""> file2"を追加します。

修正する:

別のツールがありますsedストリームエディタ、これはより短いですが、より秘密のソリューションを提供します。

 sed -n '6,${x;p;s/^[^\n]\+\n//;x};H;1h;${x;p}' file
  1. 1h「予約済み」スペースに最初の行を配置します。

  2. H予約済みスペースに行を追加します。

  3. 6,${x;p;s/^[^\n]\+\n//;x}、6行目から始めて、予約済みスペースを現在の行と置き換えて印刷し、最初の行を削除して結果を再予約済みスペースに送信します。

  4. ${x;p} は、処理の終わりに予約されたスペース (おそらく angではなく a x) を再インポートして印刷します。

おすすめ記事