GNU/Linux >> Linux の 問題 >  >> Linux

ファイルをそれ自体にn回連結するLinuxコマンド

これには 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


Linux
  1. Linuxwcコマンド

  2. Linuxgrepコマンド

  3. Linuxcatコマンド

  1. Linuxでの重要なCatコマンドの例

  2. 14 Linux での便利な「cat」コマンドの例

  3. Linux での ln コマンドの例

  1. Linuxでの16のクイックCatコマンドの例

  2. Linuxテールコマンド

  3. Linux での file コマンドの例