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 want to add $x/ from data formatted as $x-xyz (xyz is a mix of text and number to be ignored).

Example data

AB-10C
CD-02E

Output

AB/AB-10C
CD/CD-02E

How do I describe the variable as text before the hyphen? My idea is:

define $x = # dunno how to do that
## and then somehow use sed to prepend
sed -i s/$/$x/ file
# I don't know if sed can handle variables though - the above one liner is from Googling

Please advise.

share|improve this question

2 Answers 2

up vote 5 down vote accepted

Here's a quick and dirty awk version:

awk -F- '{print $1"/"$0}' input_file > output_file

What it does is use - as a field separator, and prints the first column (i.e. everything before the first -), then a /, then the whole original line.

A way of doing the same thing with sed would be:

sed -e 's;^\([^-]*\)\(.*\);\1/\1\2;' input_file > output_file

(but that's hardly readable.)

If you want to do it in plain bash, you can use string manipulations:

$ foo=AB-10C
$ prefix=${foo%%-*}
$ echo ${prefix}/${foo}
AB/AB-10C

Use that in a while read loop or similar if the data is coming from a file.

share|improve this answer
    
Though it was unintentional, I simplified the example a bit, and the results with the real data were interesting. The actual data was like 211,AB-45A,1, and it got manipulated to 211,AB/211,AB-45A,1 with both awk and sed. Couldn't try pure bash since I'm not quite familiar with while read and didn't bother researching. Anyway, I separated the relevant data and it worked as expected - thank you! –  Oxwivi Jan 29 '12 at 14:19
    
For the while loop, just type "[bash] while read" in the search box at the top of this site. You'll get plenty of examples :) –  Mat Jan 29 '12 at 14:21

This might work for you:

echo -e "123,AB-10C,4\n567,CD-02E,8" |
sed 's|\([^,]*\)-.*|\1/&|'
123,AB/AB-10C,4
567,CD/CD-02E,8
share|improve this answer

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.