#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
: Если количество полей больше 1OFS="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)'
выводить только при наличии подстановки.