Toon posts:

Command dat # characters in een string telt ???

Pagina: 1
Acties:

Verwijderd

Topicstarter
een stomme vraag misschien, maar ik heb zelf echt ff geen idee: bestaat er een command, programma voor linux waarmee ik kan tellen hoeveel keer een bepaalde character voorkomt in een enkele opgegeven string, bijvoorbeeld een filename?

stel dus, ik heb een filename 'cpx.f67238.log', en ik geef als argument op dat het het aantal punten moet tellen, dan zou het programma mij dus moeten vertellen dat er 2 punten in deze string (filename) voorkomen...

iemand een idee? (of denk ik nou heel moeilijk en kan het gewoon met grep of zo?)

  • 2P
  • Registratie: November 2001
  • Laatst online: 21-06 01:34

2P

:wq

Zelf even 1 gemaakt, vrij lelijke code, misschien heeft iemand anders een betere oplossing ;)
code:
1
2
3
4
5
#!/bin/sh

AANTAL=$((`echo "$1" | tr $2 "\n" | wc -l` - 1))

echo $AANTAL

Gebruik het zo:
code:
1
2
3
4
peter@omega:~/dev$ ./aantal.sh hier.zitten.4.punten.in .
4
peter@omega:~/dev$ ./aantal.sh hier.zitten.4.punten.in i
3

Eerste argument is de string, 2de is het karakter dat geteld moet worden.

Als je meer uitleg nodig hebt dan hoor ik het wel :P

  • 2P
  • Registratie: November 2001
  • Laatst online: 21-06 01:34

2P

:wq

-oeps-

foutje :+

  • Buffy
  • Registratie: April 2002
  • Laatst online: 26-12-2024

Buffy

Fire bad, Tree pretty

Op donderdag 06 juni 2002 22:25 schreef areana het volgende:
een stomme vraag misschien, maar ik heb zelf echt ff geen idee: bestaat er een command, programma voor linux waarmee ik kan tellen hoeveel keer een bepaalde character voorkomt in een enkele opgegeven string, bijvoorbeeld een filename?

stel dus, ik heb een filename 'cpx.f67238.log', en ik geef als argument op dat het het aantal punten moet tellen, dan zou het programma mij dus moeten vertellen dat er 2 punten in deze string (filename) voorkomen...

iemand een idee? (of denk ik nou heel moeilijk en kan het gewoon met grep of zo?)
Volgende even in file 'countchar' zetten en chmod 755 doen.
code:
1
2
3
4
5
#!/bin/sh

AWK=gawk

echo "$2" | $AWK "-F$1" '{ if (NF > 0) print  NF-1; else print 0; }'

en daarna uitvoeren:
code:
1
./countchar '.' cpx.f67238.log

-edit-
te laat :)
Maar ja er leiden meer wegen naar Rome...

That which doesn't kill us, makes us stranger - Trevor (AEon FLux)
When a finger points at the moon, the imbecile looks at the finger (Chinese Proverb)


Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <getopt.h>

extern const char *__progname;

#define error_exit(format, args...) \
  do \
  { \
    if (format) \
    fprintf(stderr, format, ##args); \
    exit(-1); \
  } while (0)

static void
usage (char *msg)
{
  fprintf(stderr, "Usage: %s [options] <text> - where options are:\n", __progname);
  fprintf(stderr, " -l char    the character to count\n");
  fprintf(stderr, " -v     version information\n");
  fprintf(stderr, " -h     this lot\n");

  error_exit(msg);
}

int
main (int   argc,
    char *argv[])
{
  int i, n, count = 0;
  char letter = 0x0;

  while ((n = getopt(argc, argv, "vhl:")) != EOF)
  {
    switch (n)
    {
    case 'h':
      usage(NULL);
      break;
    case 'v':
      error_exit("%s version 1.0\n", __progname);
      break;
    case 'l':
      letter = optarg[0];
      break;
    default:
      error_exit("Unknown option '%c'\n", n);
      break;
    }
  }
  if (letter == 0x0)
    error_exit("Illegal search character '%x'\n", letter);
  if (optind >= argc)
    usage("Too little arguments\n");

  i = optind;
  do
  {
    int j;
    for (j=0;argv[i][j];j++)
    if (letter == argv[i][j])
       count++;
  }
  while (++i < argc);

  printf("Character %x (%c) found %d times\n", letter, letter, count);

  return 0;
}

Untested. :P.

Verwijderd

Topicstarter
wooeeeii! thnx! ik ga ze ff proberen... :P *D

Verwijderd

Topicstarter
beelzebubu:
--knip--
Untested. :P.
gcc output:
code:
1
2
3
4
5
sn.c: In function `main':
sn.c:34: case label not within a switch statement
sn.c:37: case label not within a switch statement
sn.c:40: case label not within a switch statement
sn.c:43: default label not within a switch statement

:? :P

Verwijderd

Op donderdag 06 juni 2002 23:32 schreef areana het volgende:

[..]

gcc output:
code:
1
2
3
4
5
sn.c: In function `main':
sn.c:34: case label not within a switch statement
sn.c:37: case label not within a switch statement
sn.c:40: case label not within a switch statement
sn.c:43: default label not within a switch statement

:? :P
Oi... Ff aanpassen... :D.

[edit]
nu dan? (ik was de switch vergeten :D).

Verwijderd

Topicstarter
Op donderdag 06 juni 2002 23:35 schreef beelzebubu het volgende:

[..]

Oi... Ff aanpassen... :D.

nu dan? (ik was de switch vergeten).
woooeeeii... hij compiled nu wel... maar er zitten nog wel een aantal bugs in :'(

bij geen argumenten, foute argumenten of geen opties krijg ik geen leuke help over hoe het programmaatje te gebruiken, maar slechts 'Illegal search character '0''... het werkt wel, maar je moet ff weten hoe je t moet gebruiken: '%s -l'.' cpx.f67238.log' bijvoorbeeld (%s moet de naam van het programma zelf zijn uiteraard); - als je het goed doet krijg je een nette output 'Character 2e (.) found 2 times'...

Verwijderd

't is 5 minuutjes werk, had je meer verwacht? :P.

Hier nieuwe versie. ;).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <getopt.h>

extern const char *__progname;

#define error_exit(format, args...) \
  do \
  { \
    if (format) \
    fprintf(stderr, format, ##args); \
    exit(-1); \
  } while (0)

static void
usage (void)
{
  fprintf(stderr, "Usage: %s [options] <text> - where options are:\n", __progname);
  fprintf(stderr, " -l char    the character to count (MANDATORY!)\n");
  fprintf(stderr, " -v     version information\n");
  fprintf(stderr, " -h     this lot\n");
}

int
main (int   argc,
    char *argv[])
{
  int i, n, count = 0;
  char letter = 0x0;

  while ((n = getopt(argc, argv, "vhl:")) != EOF)
  {
    switch (n)
    {
    case 'h':
      usage();
      error_exit(NULL);
      break;
    case 'v':
      error_exit("%s version 1.0\n", __progname);
      break;
    case 'l':
      letter = optarg[0];
      break;
    default:
      usage();
      error_exit("Unknown option '%c'\n", n);
      break;
    }
  }
  if (optind >= argc)
  {
    usage();
    error_exit("Too little arguments\n");
  }
  if (letter == 0x0)
  {
    usage();
    error_exit("Illegal search character '0x%x'\n", letter);
  }

  i = optind;
  do
  {
    int j;
    for (j=0;argv[i][j];j++)
    if (letter == argv[i][j])
       count++;
  }
  while (++i < argc);

  printf("Character 0x%x (%c) found %d times\n", letter, letter, count);

  return 0;
}

Bugfix release. :P.

Verwijderd

Topicstarter
eeeey!! is perfect!! O+ O+ O+ O+ :* - thnx! :)

  • RdeTuinman
  • Registratie: Mei 2001
  • Laatst online: 07:25
Doe ik er nog ff een makefiletje bij. (is ook zo lastig om 1 file te compilen :P)
code:
1
2
3
4
5
6
7
8
countchar: main.o
      gcc -Wall -o countchar main.o

main.o: main.c
      gcc -c main.c -o main.o

clean:
      rm -rf *~ countchar *.o

Je kan maar nix te doen hebben :D

Maar ik vind de code wel heel stoer!! Die houden we erin ;)

Verwijderd

Bugreport:

[10:38] mathias@helena:~ > teller -l o OpenOffice.org641/
Character 0x6f (o) found 1 times
[10:39] mathias@helena:~ >

Je kan er je natuurlijk vanaf maken dat dit een feature is ;)
Misschien wat code bijprogrammeren om case sensitivity te togglen ? Kijk niet naar mij, ik zou nog meer van een Chinese tekst begrijpen dan die hoop C code |:(

Verwijderd

Zo dan? :P.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <getopt.h>

extern const char *__progname;

#define error_exit(format, args...) \
  do \
  { \
    if (format) \
    fprintf(stderr, format, ##args); \
    exit(-1); \
  } while (0)

static void
usage (void)
{
  fprintf(stderr, "Usage: %s [options] <text> - where options are:\n", __progname);
  fprintf(stderr, " -l char    the character to count (MANDATORY!)\n");
  fprintf(stderr, " -s     run case sensitive\n");
  fprintf(stderr, " -v     version information\n");
  fprintf(stderr, " -h     this lot\n");
}

static __inline__ char
chartolower (char letter)
{
  if (letter >= 'A' && letter <= 'Z')
    return letter+'a'-'A';
  else
    return letter;
}

static __inline__ void
strtolower (char *string)
{
  int i;
  for (i=0;string[i];i++)
    string[i] = chartolower(string[i]);
}

int
main (int   argc,
    char *argv[])
{
  int i, n, count = 0, case_sensitive=0;
  char letter = 0x0;

  while ((n = getopt(argc, argv, "vhl:s")) != EOF)
  {
    switch (n)
    {
    case 's':
      case_sensitive = 1;
      break;
    case 'h':
      usage();
      error_exit(NULL);
      break;
    case 'v':
      error_exit("%s version 1.0\n", __progname);
      break;
    case 'l':
      letter = optarg[0];
      break;
    default:
      usage();
      error_exit("Unknown option '%c'\n", n);
      break;
    }
  }
  if (optind >= argc)
  {
    usage();
    error_exit("Too little arguments\n");
  }
  if (letter == 0x0)
  {
    usage();
    error_exit("Illegal search character '0x%x'\n", letter);
  }
  else if (!case_sensitive)
    letter = chartolower(letter);

  i = optind;
  do
  {
    int j;
    if (!case_sensitive)
    strtolower(argv[i]);
    for (j=0;argv[i][j];j++)
    if (letter == argv[i][j])
       count++;
  }
  while (++i < argc);

  printf("Character 0x%x (%c) found %d times\n", letter, letter, count);

  return 0;
}

Verwijderd

Topicstarter
kewl :9~

Verwijderd

beelzebubu is de man 8-)
Pagina: 1