Asclepius123
Asclepius123

Reputation: 21

A way to append the beginning of every line before a pattern to the end of each same line?

I am trying to copy the beginning of every line in a text file before a certain character to the end of the same line.

I've tried duplicating each line to the end of itself, and then deleting everything after the character, but the trouble is I haven't been able to figure out how to skip the first instance of the character so the result is that the duplicated text gets deleted as well as everything beyond the first instance of the character.

I've tried things like

sed '/S/ s/$/ append text/' sample.txt > cleaned.txt

but this only adds a fixed text. I've also tried using:

s/\(.*\)/\1 \1/

to duplicate the line, and then deleting everything after the S, but I can't figure out how to get it to go to the 3rd S not the 1st to start deleting.

What I have to start with:

dog 50_50_S5_Scale
cat 10_RV_S76_Scale
mouse 15_SQ_S81_Scale

What I'm trying to get:

dog 50_50_S5_Scale dog 50_50_
cat 10_RV_17_S76_Scale cat 10_RV_17_
mouse 15_EQ_S81_Scale mouse 15_EQ_

Where everything before the first S gets copied to the end of the line.

Upvotes: 1

Views: 63

Answers (2)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626689

You may use

sed 's/\([^S]*\)S.*/& \1/' file

See the online demo

Details

  • \([^S]*\) - Capturing group 1 (\1): any 0+ chars other than S
  • S.* - S and the rest of the string (actually, line, since sed processes line by line by default).

The replacement is the concatenation of the whole match (&), space and Group 1 value.

Upvotes: 1

LPayton314
LPayton314

Reputation: 1

You could try:

awk '{print $0 " " substr($0, 0, index($0,"S") - 1)}' file

We take the substring from the first character up to but not including the first occurance of "S".

Upvotes: 0

Related Questions