Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I store files named like this: word-word2-word3-word4.txt . The number of "words" varies from file to file.

I want to replace certain of the dashes with pluses e.g word+word2-word3+word4.txt

I want to specify the dashes or minus-signs to change by typing in numbers.

I have an awkward script that doesn't work - it does this:

  • dashes are supplemented with a semi-colon for later awk splitting purposes
  • user types in numbers specifying dashes to replace
  • numbers are appended to end of filename e.g aaa-;bbb-;ccc.txt 1 3
  • and piped into awk for processing
  • in awk, make an array of the appended numbers,
  • and an array of the words with a split on the first field
  • then gsub ';' for '+' on the split array using the number array to specify the index

Here is my grisly script which hardcodes the filename for the purposes of quick fiddling and trialing. I can't think how to exit the awk script usefully. The plan is to exit awk and do a final substitution in sed.

I am quite aware this is a dogs dinner of a script displaying plenty of poor-learning. Nevertheless, please offer any help if you are disposed to.

file='wot-;wit-;wet-;wat.txt'; 
echo -n "type digits"; 
read nos; varr=$(echo $nos); 
newfile=$(echo $file $varr); 
echo "$newfile" | awk '{ for (i=2; i<=NF ;i++) arr[i]=$i}
                         END{ split($1,spl,"-");
                              for( var in arr ) gsub(";","+", spl[var]); 
                              print THIS IS NOT WORKING - CAN'T GET ANYTHING USEFUL OUT }'
share|improve this question
add comment

1 Answer 1

up vote 1 down vote accepted

I have no idea about awk, however I know the way with shell+sed:

file='wot-;wit-;wet-;wat.txt'; 
echo -n "type digits : "; 
read nos; 
# this is used to sort numbers in order, otherwise the script
# will work only when user specifies numbers in right order
# also we delete all non-numbers string to make sed code safe enough
nos="$(echo $nos|tr ' ' '\n'|sort -n|grep -v '[^0-9]'|tr '\n' ' ')"
# here we build sed code and modify the text
echo "$file" | { for i in $nos ; do A="s/-/+/$i;$A" ; done ; sed "$A" ; }
share|improve this answer
    
That works, thx. I don't quite get the last line of your script, in particular the recursive use of $A. Bash loops thru numbers stored in $nos. Each loop writes out a substitution. When the loop finishes, run the final sed which, for two numbers, is a sequence of 2 consecutive sed operations starting with the last one, and ending w the first one...(?) –  Tom Nov 20 '12 at 15:17
    
Yes, that's right. –  rush Nov 20 '12 at 18:31
    
Thanks for your help. –  Tom Nov 20 '12 at 19:43
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.