awk выводит $ 0 со значениями столбцов, разделенных новой строкой - PullRequest
0 голосов
/ 10 апреля 2020

Ввод:

"prefix_foo,prefix_bar"

Ожидаемый результат:

foo
bar

Это то, что я имею уже.

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

Я не могу понять, как напечатать foo и bar, разделенные новой строкой. Заранее спасибо!

РЕДАКТИРОВАТЬ:

  • Длина ввода неизвестна, поэтому может быть более 2 слов, разделенных запятой.
  • Этот вопрос больше касается изучения языка awk, а не альтернативных утилит gnu.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

Вам может не понадобиться awk для этого. Вот чистое bash решение:

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

foo
bar

Вот один лайнер gnu sed для того же:

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

foo
bar
2 голосов
/ 10 апреля 2020

РЕДАКТИРОВАТЬ: 2-е решение Добавление сюда более универсального c решения в соответствии с комментариями OP, это будет искать каждое поле и проверять, имеет ли оно prefix, тогда оно будет печатать 2-я часть этого столбца (после _ 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=""
}'

Чтобы напечатать значения выходного поля в новой строке, попробуйте:

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]
    }
  }
}
'


1-е решение: Для простого случая (укажите c для показанных образцов), пожалуйста, попробуйте следующее.

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

ИЛИ

echo "prefix_foo,prefix_bar" | awk -F'[_,]' '/prefix_/{print $2,$4}'
1 голос
/ 10 апреля 2020

Просто пробую awk

 echo "PREFIX_foo,PREFIX_bar" | awk -F, -v OFS="\n" '{gsub(/PREFIX_/,""); $1=$1}1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...