Слияние awk и нарезка в одну команду - PullRequest
0 голосов
/ 21 марта 2019

Моя линия:

var1="_source.statistics.test1=AAAAA;;;_source.statistics.test2=BBBB;;;_source.statistics.test3=CCCCC"

awk -F  ";;;" '{print $1}' <<<$var1 | cut -d= -f2
AAAAA
awk -F  ";;;" '{print $2}' <<<$var1 | cut -d= -f2
BBBB

Как я могу получить тот же результат, используя только AWK?

Ответы [ 3 ]

3 голосов
/ 21 марта 2019

Awk позволяет вам split поле другого разделителя.

awk -F  ";;;" '{split($1, a, /=/); print a[2] }'

Однако, возможно, более плодотворным подходом было бы преобразовать этот ужасно враждебный формат ввода во что-то более нормальное, и взять его оттуда стандартными инструментами.

sed 's/;;;/\
/g' inputfile | ...
1 голос
/ 21 марта 2019

Всякий раз, когда у вас есть входные данные name / tag = val, полезно создать массив пар тегов-значений, чтобы вы могли просто печатать или делать все что угодно с данными по их тегам, например ::

$ awk -F';;;|=' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["_source.statistics.test1"]}' <<<"$var1"
AAAAA

$ awk -F';;;|=' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["_source.statistics.test3"], f["_source.statistics.test2"]}' <<<"$var1"
CCCCC BBBB
1 голос
/ 21 марта 2019

Не могли бы вы попытаться выполнить следующие действия в пределах одного awk, используя разделитель полей -F, установив его как = или ; для каждой строки, переданной awk.

echo "$var1" | awk -F'=|;' '{print $2}'
AAAAA
echo "$var1" | awk -F'=|;' '{print $6}'
BBBB

OR

echo "$var1" | awk -F"=|;;;" '{print $2}'
AAAAA
echo "$var1" | awk -F"=|;;;" '{print $4}'
BBBB


Учитывая, что вам нужны эти выходные данные для переменных, если да, то вы можете использовать их как sed и поместить их значения в массив, а затем использовать их. ИМХО именно поэтому создаются массивы, чтобы сэкономить наше время на создание N чисел переменных.

Создание массива с помощью sed:

array=( $(echo "$var1" | sed 's/\([^=]*\)=\([^;]*\)\([^=]*\)=\([^;]*\)\(.*\)/\2 \4/'  ) )

Создание массива с помощью awk:

array=( $(echo "$var1" | awk -F"=|;;;" '{print $2,$4}') )

Выше будет создан массив со значениями AAAAA и BBBB, теперь для его извлечения вы можете использовать.

for i in {0..1}; do echo "$i : ${array[$i]}"; done
0 : AAAAA
1 : BBBB

Я использовал петлю for для вашего понимания, можно использовать array[0] для AAAAA или array[1] для BBBB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...