これには 2 つの部分があります。最初に、cat を使用してテキスト ファイルを標準出力に出力し、append を使用してそれを別のファイルに追加します。たとえば、foo.txt>>bar.txt は foo.txt を bar.txt に追加します。
次に、
で n 回実行しますfor i in {1..n};do cat foo.txt >> bar.txt; done
そのコマンドの n をあなたの番号に置き換えてください
ここで n はあなたの番号です
csh を使用する場合は、'repeat' コマンドがあります。
回答の繰り返し関連部分は here からコピーされ、デフォルトの bash シェルの ubuntu 11.04 システムでテストしました。
確かに cat
を使用できます このため:
$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo
$n
を取得するには コピー、yes
を使用できます head -n $n
にパイプ :
$ yes /tmp/f | head -n 10
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
それをまとめると
yes /tmp/f | head -n $n | xargs cat >/tmp/output
私は退屈なので、ファイルをそれ自体に連結する方法についていくつかの方法を次に示します。主に head
を使用します 松葉杖として。私が自分自身を説明しすぎたら、私を許してください、私はただ物事を言うのが好きです:P
N
と仮定すると 実行したい自己連結の数であり、ファイルの名前は file
です .
変数:
linecount=$(<file wc -l)
total_repeats=$(echo "2^$N - 1" | bc) # obtained through the power of MATH
total_lines=$((linecount*(total_repeats+1)))
tmp=$(mktemp --suffix .concat.self)
file
のコピーが与えられた場合 file2
と呼ばれる 、 total_repeats
file
の回数です file2
に追加する必要があります file
の場合と同じにする それ自体に連結されました N
数学と言った 多かれ少なかれここにあります:MATH (要旨)
一学期のコンピュータサイエンスの話ですが、帰納法証明をやったのは久しぶりなので、乗り越えられません... (また、このクラスの再帰は 2^Loops
であることがよく知られています) それもあります....)
POSIX
私はいくつかの非 posix のものを使用していますが、それらは必須ではありません。私の目的のために:
yes() { while true; do echo "$1"; done; }
あ、これだけ使った。まあ、セクションはすでにここにあります...
方法
head
行数追跡付き。
ln=$linecount
for i in $(seq 1 $N); do
<file head -n $ln >> file;
ln=$((ln*2))
done
一時ファイルも猫も、まだ数学もあまりしていないので、すべてが楽しいです。
tee
数学で
<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file
こちら tee
file
から読み取っています ただし、永続的に追加されるため、head
まで繰り返しファイルを読み取り続けます。 それを停止します。 MATH のおかげでいつやめるべきかわかっています .追加はやり過ぎなので、一時ファイルを使用しました。 file
から余分な行を削除できます
eval
、闇の王よ!
eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file
これは単に cat file file file ...
に展開されます $tmp
なしで実行できます ファイルも:
eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
head -n $((total_lines-linecount)) >> file
2 番目の head
"トリック" cat
それと書き込み操作の間に仲介者を置くことによって。 cat
をだますことができます 別の cat
と 同様に、それは一貫性のない動作をしています。これを試してください:
test_double_cat() {
local Expected=0
local Got=0
local R=0
local file="$(mktemp --suffix .double.cat)"
for i in $(seq 1 100); do
printf "" > $file
echo "1" >> $file
echo "2" >> $file
echo "3" >> $file
Expected=$((3*$(<file wc -l)))
cat $file $file | cat >> $file
Got=$(<file wc -l)
[ "$Expected" = "$Got" ] && R="$((R+1))"
done
echo "Got it right $R/100"
rm $file
}
sed
:
<file tr '\n' '\0' |
sed -e "s/.*/$(yes '\0' | head -n $total_repeats | tr -d '\n')/g" |
tr '\0' '\n' >> file
フォース sed
ファイル全体を1行として読み取り、すべてをキャプチャしてから貼り付けます $total_repeats
回数。
ファイルにヌル文字がある場合、これはもちろん失敗します。そこにないとわかっているものを 1 つ選んでください。
find_missing_char() {
local file="${1:-/dev/stdin}"
firstbyte="$(<$file fold -w1 | od -An -tuC | sort -un | head -n 1)"
if [ ! "$firstbyte" = "0" ]; then
echo "\0"
else
printf "\\$(printf '%03o\t' $((firstbyte-1)) )"
fi
}
今のところはこれで終わりです。この恣意的な答えが誰にも迷惑をかけなかったことを願っています。私はそれらすべてを何度もテストしましたが、私は 2 年間のシェル ユーザーにすぎないので、覚えておいてください。もう寝る...
rm $tmp