GNU/Linux >> Znalost Linux >  >> Linux

Linuxový příkaz pro zřetězení souboru k sobě nkrát

Dvě části, pro mě - první - použití cat pro výstup textového souboru na standardní výstup a použití append pro jeho přidání do jiného souboru - např. foo.txt>>bar.txt připojí foo.txt k bar.txt

pak jej spusťte nkrát pomocí

for i in {1..n};do cat foo.txt >> bar.txt; done

nahraďte n v tomto příkazu svým číslem

by mělo fungovat, kde n je vaše číslo

Pokud používáte csh, je zde příkaz 'repeat'.

opakovat související části odpovědi jsou zkopírovány odtud a testoval jsem to na systému ubuntu 11.04 na výchozím bash shellu.


Určitě můžete použít cat pro toto:

$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo

Chcete-li získat $n kopií, můžete použít yes přesměrován do 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

Dát to dohromady dá

yes /tmp/f | head -n $n | xargs cat >/tmp/output

Nudím se, takže zde je několik dalších metod, jak zřetězit soubor k sobě, většinou pomocí head jako berlička. Promiň, jestli to přeženu, jen rád říkám věci :P

Za předpokladu N je počet vlastních zřetězení, které chcete provést, a že váš soubor se jmenuje file .

Proměnné:

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)

Je poskytnuta kopie file s názvem file2 , total_repeats je počet, kolikrát file bude nutné přidat do file2 aby to bylo stejné jako file byl zřetězen k sobě N krát.

Řekl MATH je zde víceméně:MATH (podstata)

Je to počítačová věda z prvního semestru, ale už je to nějaký čas, co jsem dělal indukční důkaz, takže to nemůžu překonat... (tato třída rekurze je docela dobře známá jako 2^Loops tak to je taky....)

POSIX

Používám několik věcí, které neposixové, ale nejsou nezbytné. Pro mé účely:

 yes() { while true; do echo "$1"; done; }

Oh, jen jsem to použil. Aha, sekce už je tady...

Metody

head se sledováním počtu řádků.

ln=$linecount
for i in $(seq 1 $N); do
    <file head -n $ln >> file;
    ln=$((ln*2))
done

Žádný dočasný soubor, žádná kočka, ještě ani moc matematiky, samá radost.

tee pomocí MATH

<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file

Zde tee čte z file ale neustále se k němu připojuje, takže bude soubor číst opakovaně až do head zastaví to. A my víme, kdy s tím přestat, protože MATH . Připojení jde přes palubu, takže jsem použil dočasný soubor. Můžete oříznout přebytečné čáry z file taky.

eval , pán temnoty!

eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file

Toto se pouze rozšíří na cat file file file ... a vyhodnotí to. Můžete to udělat bez $tmp soubor také:

eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
  head -n $((total_lines-linecount)) >> file

Druhý head "triky" cat tím, že mezi něj a operaci zápisu vložíte prostředníka. Můžete oklamat cat s jiným cat také, ale to má nekonzistentní chování. Zkuste toto:

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

Vynutí sed přečte celý soubor jako řádek, zachytí jej celý a vloží jej $total_repeats kolikrát.

To samozřejmě selže, pokud máte v souboru nějaké prázdné znaky. Vyberte ten, o kterém víte, že tam není.

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
}

To je zatím vše, chlapci, doufám, že tato svévolná odpověď nikoho neobtěžovala. Všechny jsem testoval mnohokrát, ale jsem pouze dvouletým uživatelem shellu, takže si to myslím. Teď spát...

rm $tmp


Linux
  1. Důležité příklady příkazů Cat v Linuxu

  2. Příkaz wc pro Linux

  3. V příkladech příkazů v Linuxu

  1. Linuxový příkaz grep

  2. Linuxový příkaz cat

  3. soubor Příklady příkazů v Linuxu

  1. 16 Příklady příkazů Quick Cat v Linuxu

  2. Linux Tail Command

  3. 14 Užitečné příklady příkazů „cat“ v Linuxu