Home > database >  add prefix to each column with sed
add prefix to each column with sed

Time:08-18

I have a header and what to add the prefix "f4_" to each column.

I tried this:

echo -e  p.value"\t"beta | sed "s/\</f4_/g"

and got this:

f4_p.f4_value   f4_beta

I want this:

f4_p.value   f4_beta

I think the special character . in the header is messing this up but I am not sure how to fix

CodePudding user response:

You can try this awk:

printf 'p.value\tbeta\n' |
awk 'BEGIN{FS=OFS="\t"} {for (i=1; i<=NF;   i) $i = "f4_" $i} 1'

f4_p.value  f4_beta

CodePudding user response:

You can add the prefix at the start or after TAB only with

echo -e  p.value"\t"beta | sed -E "s/^|\t/&f4_/g"
# => f4_p.value f4_beta

See the online demo.

Here,

  • -E enables POSIX ERE regex syntax
  • ^|\t - matches either start of a string or a TAB
  • & in the replacement puts back what was matched.

CodePudding user response:

Since you want to add it to each column, you should add it after each column separator. In this case, the separator is \t:

$ echo -e  p.value"\t"beta | sed "s/\t/&f4_/g"
p.value f4_beta

(Here & means "the part s/// matched before," which will be \t)

This will miss, of course, the first column, so we add the beginning of line wildcard (^) to the matching regex. For that, we use the \| operator, which allows both of its sides to be matched:

$ echo -e  p.value"\t"beta | sed "s/^\|\t/&f4_/g"
f4_p.value  f4_beta

CodePudding user response:

Use this Perl one-liner:

echo -e  p.value"\t"beta | perl -F'\t' -ane 'print join "\t", map { "f4_$_" } @F;'

The Perl one-liner uses these command line flags:
-e : Tells Perl to look for code in-line, instead of in a file.
-n : Loop over the input one line at a time, assigning it to $_ by default.
-a : Split $_ into array @F on whitespace or on the regex specified in -F option.
-F'/\t/' : Split into @F on TAB, rather than on whitespace.

SEE ALSO:
perldoc perlrun: how to execute the Perl interpreter: command line switches

  • Related