Viewing 8 posts - 1 through 8 (of 8 total)
  • More perl/awk computer related help please
  • jcromton
    Free Member

    Hi,

    I know it may be taking the biscuit a bit, but further to this thread:

    http://www.singletrackworld.com/forum/topic/computer-question-awk-sed-grep-or-anything

    I’m making great use of Aidy’s / RichP’s perl / awk commands.

    To further optimise my life, any help on the following would be awesome:

    The original column of numbers:

    0
    0

    0
    1
    1

    1

    n
    n

    n

    where n is any positive integer. This column is the third, where the first two represent lat and long.

    I would to take the first occurrence of “n”, copy that entire line and replace it after the last occurrence of “n”. For example – in the following simple example we have

    x_1 y_1 0
    x_2 y_2 0
    x_3 y_3 0
    x_4 y_4 1
    x_5 y_5 1
    x_6 y_6 1
    x_7 y_7 1

    to turn into

    x_1 y_1 0
    x_2 y_2 0
    x_3 y_2 0
    x_1 y_1 0
    x_4 y_4 1
    x_5 y_5 1
    x_6 y_6 1
    x_7 y_7 1
    x_4 y_4 1

    And then I can apply the command to the third column to finish the job.

    Any help would be much appreciated, it’s either this or cutting and pasting 273 times. I realise this method will add 273 lines to my file.

    Many thanks in advance,

    Chris

    mancjon
    Free Member

    Here you go, apologies for the appearance, can seem to get lines of code to indent.

    #!perl

    open FID, “$ARGV[0]” or die “Can’t open file – $ARGV[0]\n”;

    $current = -1;

    while (<FID>) {
    $index = (split(‘ ‘, $_))[2];
    if ($index != $current) {
    print $saved;
    print $_;
    $saved = $_;
    $current = $index;
    } else {
    print $_;
    }
    }

    print $saved;

    richP
    Full Member

    I think that this should work
    awk “{if (NR==1){ind=$3;line=$0};if ( NR>0 ) { if ($3!=ind) {print line;{print $0};line=$0} else{print $0}};ind=$3}” in_filename.txt > out_filename.txt

    You could probably combine the two operations into one script.

    jcromton
    Free Member

    mancjon – that works an absolute treat thank you very much.

    richP – it doesn’t seem to work, I’ll play around though and hopefully get something out of it.

    Thank you both so much. I need to learn perl. Out of interest, where/how did you learn it?

    Cheers

    Chris

    cranberry
    Free Member

    The best way to learn perl ( outside of a training course ) would be to get O’Reilley’s set of books…

    http://oreilly.com/pub/topic/perl

    These 3 should help you on your way:

    Learning Perl
    The Perl cookbook
    Programming Perl

    mancjon
    Free Member

    Chris

    I would second cranberry’s recommendation. “Learning Perl” will definitely get you to the stage where you could write the above sort of programs.

    One slight note of warning. Perl is not the most structured language and usually there are multiple ways of achieving the same thing. From my experience, people can get hung up on the “best” way to do something in Perl. My advice would be to just ignore all that and simply learn enough to do what you want.

    Jon

    richP
    Full Member

    did you get the awk script to work?
    What was the problem?

    jcromton
    Free Member

    Hi richP, I wasn’t able to get your script to work, it works, but only for the first set of numbers.

    mancjon’s script has been working well though so I’ve been sticking with that.

    Cheers again guys 🙂

Viewing 8 posts - 1 through 8 (of 8 total)

The topic ‘More perl/awk computer related help please’ is closed to new replies.