Welcome to my website. I am always posting links to photo albums, art, technology and other creations. Everything that you will see on my numerous personal sites is powered by the formVistaTM Website Management Engine.

icon.linkedin.jpgicon.twitter.jpg

  • Removing the Last Token From a String in Bash with awk
    09/04/2014 5:07PM

    Let's say that you have some number of files for which you want to create a containing directory that is named with all but the last token of the file name, and you want to remove just the last token to create the name of the directory.

    Much easier to explain with an example.  Given this list of files:

    $ ls -1
    foo_10_10_sometrash
    foo_1_sometrash
    foo_2_sometrash
    foo_3_sometrash
    foo_4_sometrash
    foo_5_5_sometrash
    foo_5_sometrash
    foo_6_6_sometrash
    foo_7_7_sometrash
    foo_8_8_sometrash
    foo_9_9_sometrash

    You want to create a directory for each of the files as follows:

    foo_5_sometrash should have a directory named foo_5.

    Further, let's assume that you have thousands, or hundreds of thousands of files.  In that case doing it via a script while you get a cup of coffee is the preferred solution.

    The work will be done within a for i in loop iterating over the output from ls with a nested awk command.

    for i in `ls -1`; do DIRNAME=$(echo $i | awk -F_ '{$NF=""; print $0}' | sed 's/ /_/g' | sed 's/_$//g'); mkdir $DIRNAME; done

    Here is the command broken down:

    DIRNAME=$(....)

    will set the var $DIRNAME to the result of the scripting within the parenthesis.

    awk -F_ '{$NF=""; print $0}

    will set the field separator to a '_', the character on which you will be 'splitting' your string.  '$NF=""' will set the last field to an empty string and then the 'print $0' will print the entire input line.

    The following sed commands will replace the spaces generated by the awk command with the original separators, '_', and then remove the spurious, trailing '_'.


Advanced Search

Categories

Archives