shadyabhi
shadyabhi

Reputation: 17234

awk print $0 with newline separated column values

Input:

"prefix_foo,prefix_bar"

Expected Output:

foo
bar

This is what I've so far.

$ echo "PREFIX_foo,PREFIX_bar" | awk '/PREFIX_/{x=gsub("PREFIX_", ""); print $0 }'
foo,bar

I'm unable to figure out how to print foo and bar separated by a newline. Thanks in advance!

EDIT:

Upvotes: 0

Views: 494

Answers (3)

anubhava
anubhava

Reputation: 785128

You may not need awk for this. Here is pure bash solution:

s="prefix_foo,prefix_bar"
s="${s//prefix_/}"
s="${s//,/$'\n'}"
echo "$s"

foo
bar

Here is one liner gnu sed for the same:

sed 's/prefix_//g; s/,/\n/g' <<< "$s"

foo
bar

Upvotes: 3

RavinderSingh13
RavinderSingh13

Reputation: 133508

EDIT: 2nd solution Adding more generic solution here as per OP's comments, this will Look for every field and check if its having prefix then it will print that column's 2nd part(after _ one).

echo "prefix_foo,etc,bla,prefix_bar" | 
awk '
BEGIN{
  FS=OFS=","
}
{
  for(i=1;i<=NF;i++){
    if($i~/prefix/){
      split($i,array,"_")
      val=(val?val OFS:"")array[2]
    }
  }
  if(val){
    print val
  }
  val=""
}'

To print output field values in new line try:

echo "prefix_foo,etc,bla,prefix_bar" | 
awk '
BEGIN{
  FS=OFS=","
}
{
  for(i=1;i<=NF;i++){
    if($i~/prefix/){
      split($i,array,"_")
      print array[2]
    }
  }
}
'


1st solution: For simple case(specific to shown samples) could you please try following.

awk -F'[_,]' '/prefix_/{print $2,$4}'  Input_file

OR

echo "prefix_foo,prefix_bar" | awk -F'[_,]' '/prefix_/{print $2,$4}'

Upvotes: 2

Jetchisel
Jetchisel

Reputation: 7791

Just trying out awk

 echo "PREFIX_foo,PREFIX_bar" | awk -F, -v OFS="\n" '{gsub(/PREFIX_/,""); $1=$1}1'

Upvotes: 1

Related Questions