сценарии оболочки - извлечение отдельных полей - список полей из части создания списка полей

Введите master_table_list.txt (Образец одной записи, разделенной символом |)


hub_business_partner|`hash_business_partner` string COMMENT 'Surrogate Key for Business Partner', `key_business_partner` string COMMENT 'Business Key for Business Partner', `rec_srce` string COMMENT 'Record Source'|`rec_date` timestamp|key_business_partner|rec_date|COMMENT 'Business Partner Hub'|customer

Необходим вывод в файле insert_table_preparation.txt


customer|hub_business_partner|hash_business_partner,key_business_partner,rec_srce,rec_date

Используемый код


echo $line | awk -F'|' '{printf("'%s'\n",);}' | grep -o '`.*`'| tr -d '``' >>insert_table_preparation.txt

Пожалуйста, помогите мне извлечь хотя бы второе поле (список полей).

Заранее спасибо.

С уважением, Мало


person Malo    schedule 25.01.2017    source источник
comment
ИМХО, у вас не было ответов, потому что вы просите нас посмотреть на стопку текста и распечатать из нее какую-то другую стопку текста без информации об алгоритме, который вы хотите использовать для перевода, и командной строке, которая у вас уже есть. это беспорядок, а не то, на чем можно основываться, поэтому нет никакого способа помочь вам. Если вы отредактируете свой вопрос, чтобы объяснить алгоритм, который вы хотите помочь реализовать, который преобразует опубликованный ввод в опубликованный вывод, вы можете получить некоторые ответы.   -  person Ed Morton    schedule 25.01.2017


Ответы (1)


Это быстрый и грязный ответ, но он читает строку ввода вашего примера и выводит ваш пример вывода:

echo $line | sed -e "s/ string COMMENT[^,|]*//g" -e "s/\`//g" -e "s/, /,/g" | awk 'BEGIN{ FS = "|"; OFS = "" } { split($2, foo, ","); print $7, "|", $1, "|", foo[1], ",", foo[2], ",", foo[3], "|", $5 }'
person Leslie    schedule 27.01.2017
comment
Привет, Лесли, твой грязный маленький ответ работает нормально. Спасибо. Однако, если имена полей различаются по количеству, существует ли какой-либо общий способ их разделения? Кажется, мы используем foo[1], foo[2] и т. д. Может ли быть что-то вроде foo[i], чтобы сделать решение более общим? Еще раз спасибо за ваши усилия. - person Malo; 30.01.2017
comment
Мало, рад, что мой отзыв оказался полезным. Функция split возвращает количество полей в созданном ею массиве, поэтому вы можете сделать что-то вроде k = split($2, foo, ,); для ( i = 1; i ‹= k; i++) выведите foo[i]; - person Leslie; 30.01.2017