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

Název: Shell - čtení textového souboru znak po znaku
Přispěvatel: 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.
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: nettezzaumana 06 Května 2009, 18:34:05
sed 's/\(.\)/\1\n/g' /etc/passwd ## rozlozi soubor na co znak, to radek, napriklad ..

.. spis ale prozrad jaka muka pro jednotlive znaky chystas :) ?!
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: timmynovak 06 Května 2009, 21:08:48
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.
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: kkaarreell 07 Května 2009, 08:31:08
bych radsi sahl po perlu ci jinym jazyku
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: timmynovak 07 Května 2009, 13:13:22
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...
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: nettezzaumana 08 Května 2009, 02:37:22
je to ale extremne pomaly ..

Kód: [Vybrat]
#!/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;

Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: nettezzaumana 08 Května 2009, 03:12:20
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) ..
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: premet 08 Května 2009, 07:56:58
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 ??
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: ufaak 08 Května 2009, 07:58:07
co treba
Kód: [Vybrat]
#!/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 :)
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: premet 08 Května 2009, 08:33:25
Nebo v C něco takového ?
Kód: [Vybrat]
#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í.
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: ufaak 08 Května 2009, 08:51:26
tak jsem tam dal i ten sleep...

Kód: [Vybrat]
#!/bin/bash

while read -n1 char; do
 echo "$char"
 sleep $2
done < $1
exit 0
Název: Re: Shell - čtení textového souboru znak po znaku
Přispěvatel: jfoot 08 Května 2009, 09:47:48
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.." ?