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

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

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

元のテキストファイル:

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) を再インポートして印刷します。

答え2

# get number of lines in the file
n=$( wc -l <file )

# extend the file
awk -v n="$n" 'NR <= n { print $1+1 >>FILENAME }' file

これら2つのコマンドを必要なだけ数回実行してください。

プログラムawkは、読んでいるのと同じファイルにその行を追加します。追加されるデータは、既存の数字に1を加えたものです。

ファイルの行数に制限しないと(を使用してNR <= n)、パーティションがいっぱいになるまで無限に大きくなります。

答え3

与えられたinputファイルseq 10 > input:

1
2
3
4
5
6
7
8
9
10

以下は、ファイルの行を繰り返して5つの各ブロックを印刷します。

n=$(wc -l < input)
for((i=1; i <= n-4; i++)); do sed -n "$i,$((i+4))p" < input; done

次に続く:

1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
4
5
6
7
8
5
6
7
8
9
6
7
8
9
10

関連情報