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