Search code examples
linuxshellawkscriptingcut

concatination of cut putting variable inside it


I have coded the following code :

Fileformat=$2
Fileresource=$1

 for (( j=1; j<=3; j++ ))
       {


        First_Pos_resource=$(awk -F ';' 'NR=='$j'{print $3}' "${Fileformat}")
        Length_resource=$(awk -F ';' 'NR=='$j'{print $4}' "${Fileformat}")
        last_Pos_resource=$((Pos_resource+Length_resource))
        range=${First_Pos_resource}"-"${last_Pos_resource}
        OUtput_line=${OUtput_line}$(cut -c${range} "${Fileresource}")

       }
            echo $OUtput_line  >> OutputFile.txt

Fileformat : is the structure that the outputFile.txt should respect. Fileformat.txt defines the: Name;Position In Output;Position In resourcefile ; lenght of string to cut from the ressource file

Fileformat.txt looks like this :

first;1;15;2
second;3;6;4
blabla;7;23;8

Fileresource :it contains a line of strings,from which we generate the output file

it looks like this :

sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf

So to sum up : File resource + File Format = OutputFile.txt

Explanation

first;1;15;2 + sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf = jd
second;3;6;4 + sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf = ffgd
blabla;7;23;5 + sfdssdffgdfglkjdfsld lkjlkkfdssdfssdf = dfssd

so after concatenation I should have this result in the output file : Output.txt looks like this

jdffgddfssd

I have coded the above lines but I have a problem with the white-space generated after concatenation

output displayed but not desired:

jd ffgd dfssd

Solution

  • The error message looks like your variables are not being correctly set. Without access to your precise input files, it's hard to debug this; but copy/pasting your data produces range values like this for me:

    range=15-+2
    range=6-+4
    range=23-+8
    

    which are obviously incorrect. If you wanted the shell to perform arithmetic on the value, you need to use (( arithmetic expressions )) for that.

    Anyway, your loop looks like it's completely inside out. Also, refactoring the entire script into a single Awk script will make it both more efficient and simpler.

    awk -F ';' 'NR==FNR { res = res $0; next }
      { printf "%s", substr(res, $3, $4) }
      END { print "" }' resource fileformat.txt
    

    I don't get exactly the output you prescribe but I may have some copy/paste error in the data, or misunderstand how exactly you want to calculate the substring offsets.

    (I couldn't help but correct the spelling of "resource".)