![再帰的に繰り返されるテキスト行リストの作成 [閉じる]](https://linux33.com/image/129348/%E5%86%8D%E5%B8%B0%E7%9A%84%E3%81%AB%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%95%E3%82%8C%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E8%A1%8C%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%20%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
テキストファイルを拡張する方法:
元のテキストファイル:
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
もちろん
file
ファイル名に変更してください。awk
入力を1行ずつ処理し、それに対して「動作」するプログラムです。out=out$0\n
変数を作成し、out
現在の行を変数に追加してから改行文字を追加します。NR>5{...}
これは、行5より大きいレコード(行など)に対して中括弧内の操作を実行します。printf "%s", out
変数を印刷しますout
。sub("^[^\n]+\n","",out)
out
ここでは、最初の改行文字の先頭まで空の文字列に置き換える削除コマンドとして使用される代替コマンドです。出力を2番目のファイルに保存するには、行の
file2
最後に ""> file2"を追加します。
修正する:
別のツールがありますsed
。ストリームエディタ、これはより短いですが、より秘密のソリューションを提供します。
sed -n '6,${x;p;s/^[^\n]\+\n//;x};H;1h;${x;p}' file
1h
「予約済み」スペースに最初の行を配置します。H
予約済みスペースに行を追加します。6,${x;p;s/^[^\n]\+\n//;x}
、6行目から始めて、予約済みスペースを現在の行と置き換えて印刷し、最初の行を削除して結果を再予約済みスペースに送信します。${x;p} は、処理の終わりに予約されたスペース (おそらく an
g
ではなく ax
) を再インポートして印刷します。
答え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