Shell awk — печать позиции из переменной

#shell #awk

#оболочка #awk

Вопрос:

Вот моя строка, которую необходимо проанализировать.

 line='aaa vvv ccc'
 

Мне нужно печатать значения одно за другим.

 no_of_users=$(echo $line| wc -w)
 

Если значение no_of_users больше 1, мне нужно печатать значения одно за другим.

 aaa
vvv
ccc
 

Я использовал этот скрипт.

 if [ $no_of_users -gt 1 ]
 then 
 for ((n=1;n<=$no_of_users;n  ))
  do 
 
  -- here is my issue ##echo 'user:'$n $line|awk -F ' ' -vno="${n}" 'BEGIN { print no }'
   done
fi
 

В { print no } я должен напечатать значение в этой позиции.

Комментарии:

1. привет, Бхуванеш, не могли бы вы сообщить мне, помог ли вам мой ответ здесь? В разделе комментариев моего ответа, пожалуйста, приветствуйте.

Ответ №1:

Вы можете использовать это awk :

 awk 'NF>1 {OFS="n"; $1=$1} 1' <<< "$line"
aaa
vvv
ccc
 

Что он делает:

  • NF>1 : Если количество полей больше 1
  • OFS="n" : Установите разделитель полей вывода на n
  • $1=$1 : Принудительная реструктуризация записи
  • 1 : Печать записи

Ответ №2:

1-е решение: в пределах одного awk , не могли бы вы попробовать следующее. Где var awk переменная, в которой есть line значение переменной оболочки.

 awk -v var="$line" '
BEGIN{
  num=split(var,arr," ")
  if(num>1){
    for(i=1;i<=num;i  ){ print arr[i] }
  }
}'
 

Объяснение: добавление подробного объяснения выше.

 awk -v var="$line" '                     ##Starting awk program and creating var variable which has line shell variable value in it.
BEGIN{                                   ##Starting BEGIN section of program from here.
  num=split(var,arr," ")                 ##Splitting var into array arr here. Saving its total length into variable num to check it later.
  if(num>1){                             ##Checking condition if num is greater than 1 then do following.
    for(i=1;i<=num;i  ){ print arr[i] }  ##Running for loop from i=1 to till value of num here and printing arr value with index i here.
  }
}'
 

2-е решение: добавление еще одного решения, протестированного и написанного на GNU awk .

 echo "$line" | awk -v RS= -v OFS="n" 'NF>1{$1=$1;print}'
 

Ответ №3:

Другой вариант:

 if [ $no_of_users -gt 1 ]
 then 
 for ((n=1;n<=$no_of_users;n  ))
  do 
  echo 'user:'$n $(echo $line|awk -F ' ' -v x=$n '{printf $x }')
   done
fi
 

Ответ №4:

Вы можете использовать grep

 echo $line | grep -o '[a-z][a-z]*'
 

Комментарии:

1. Печать должна выполняться только в том случае, если имеется более одного имени

Ответ №5:

Также с awk :

 awk '{print $1, $2, $3}' OFS='n' <<< "$line"
aaa
vvv
ccc
 
  • ключ — это настройка OFS='n'

Ответ №6:

Или действительно крутой:

 printf "%sn" $line
 

(примечание: $line без кавычек)

printf будет использовать все слова line с применением разделения слов, поэтому каждое слово воспринимается как отдельный ввод.

Пример использования / вывода

 $ line='aaa vvv ccc'; printf "%sn" $line
aaa
vvv
ccc
 

Ответ №7:

Использование bash:

 $ line='aaa vvv'ccc'
$ [[ $line =~   ]] amp;amp; echo -e ${line// /\n}
aaa
vvv
ccc

$ line=aaa
$ [[ $line =~   ]] amp;amp; echo -e ${line// /\n}
$ 
 

Если вы находитесь в другой оболочке:

 $ line="foo bar baz" bash -c '[[ $line =~   ]] amp;amp; echo -e ${line// /\n}'
 

Ответ №8:

 grep -Eq '[[:space:]]' <<< "$line" amp;amp; xargs printf "%sn" <<< $line
 

Выполните молчаливый grep для пробела в переменной, если true, выведите имена в отдельных строках.

Ответ №9:

 awk -v OFS='n' 'NF>1{$1=$1; print}'
 

например

 $ line='aaa vvv ccc'
$ echo "$line" | awk -v OFS='n' 'NF>1{$1=$1; print}'
aaa
vvv
ccc

$ line='aaa'
$ echo "$line" | awk -v OFS='n' 'NF>1{$1=$1; print}'
$
 

Ответ №10:

еще awk один вариант игры в гольф

 $ awk 'gsub(FS,RS)'
 

выводить только при наличии подстановки.