Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: timmynovak 06 Května 2009, 16:41:10
-
Ahoj, jde nějak v shellu přečíst jednoduše znak po znaku textový soubor? Myšlenka je, že potřebuji s každým znakem toho souboru něco udělat a pak jít na zpracování dalšího. Díky.
-
sed 's/\(.\)/\1\n/g' /etc/passwd ## rozlozi soubor na co znak, to radek, napriklad ..
.. spis ale prozrad jaka muka pro jednotlive znaky chystas :) ?!
-
potrřebuji ten soubor po znaku poslat do dalšího programu, který jej zpracovává. Bohužel ten program je napsán dementně a očekává na vstupu pouz ejeden znak apak po něm potřebuji zajisti chvíli prostoj. tak jsem si říkal, že bych to udělal v shellu.
-
bych radsi sahl po perlu ci jinym jazyku
-
chci s tím mít co nejméně práce, perl neumím. v podstatě fakt nejde o nic jiného, než v shellu číst znak po znaku...
-
je to ale extremne pomaly ..
#!/bin/bash
usage() {
cat << 'EOF'
USAGE: brb <path_to_file> <interval_in_seconds_between_print_chars>
ADVANCED:
path_to_file : cat ARGUMENT (in real)
interval_* : sleep ARGUMENT (in real)
EXAMPLE:
foo | brb - 0.02 ## use foo cmd as input
brb "-n foo" 0.02 ## number all output lines
EOF
exit 1;
};
if test -z "$(echo $2 | sed '/^[0-9]\+\(\.[0-9]\+\)\?$/!d')"; then
echo -e '!! bad interval !!\n';
usage 1>&2;
fi
readcmd="cat $1";
($readcmd 2>/dev/null || usage 1>&2) | \
while read line; do
trap 'echo; exit' INT;
echo "$line" | \
while IFS= read -n 1 char; do
echo -n "$char";
sleep $2;
done;
echo;
done;
-
ad.1) dost by me zajimalo kde mam chybu, ze to je tak desne pomale:
> time (seq 1 1000 | ./xx.sh - 0 >/dev/null)
real 0m28.300s
user 0m2.292s
sys 0m2.584s
> time (seq 1 1000 | cat - >/dev/null)
real 0m0.009s
user 0m0.008s
sys 0m0.004s
2) pokud mi nekdo v bashi demonstruje, jak to napsat aby to bezelo lip, budu mu zavazan ..
zadani :: program cte znak po znaku vstup/file a mezi znaky je delay $d. program musi jit ukoncit pomoci ctrl+c
ps. dost rad bych to videl od nekoho ze zdejsich c/c++ masteru (a ze jich tu par je s pusou plnou kecu) ..
-
ps. dost rad bych to videl od nekoho ze zdejsich c/c++ masteru (a ze jich tu par je s pusou plnou kecu) ..
Jako v Cčku ??
-
co treba
#!/bin/bash
while read -n1 char; do
echo "$char"
done <input.file
exit 0
edit: samozrejme by se to muselo doladit "k obrazu svemu" i s tim delay, ale nemyslim ze by to mel byt nejaky problem... nicmene jeste se valim v posteli, tak se tim nechci zabyvat :)
-
Nebo v C něco takového ?
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Chybny pocet argumentu\n");
return 1;
}
FILE *fr;
int c;
if ((fr = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Soubor neexistuje\n");
return 1;
}
while((c = fgetc(fr)) != EOF) {
putchar(c);
}
if ((fclose(fr)) == EOF) {
fprintf(stderr, "Soubor se nepodarilo ukoncit\n");
return 1;
}
return 0;
}
EDIT: Ani tam "stdlib.h" být nemusí.
-
tak jsem tam dal i ten sleep...
#!/bin/bash
while read -n1 char; do
echo "$char"
sleep $2
done < $1
exit 0
-
Zdravim vsechny,
otazka na nettezzaumana : Proc by mel byt problem resen na pude C | C++ ?
Pominu li fakt, ze tim opousti puvodni zadani (resit problem v shellu) pak
reseni problemu realizovane kompilovanym jazykem (C | C++) by ze sve podstaty
melo byt rychlejsi nez reseni provedene jazykem scriptovacim.
Pokud se tedy nepletu, proc nasleduje Vase vyzva :
"...ps. dost rad bych to videl od nekoho ze zdejsich c/c++ masteru.." ?