Как разделить строку на разделитель и добавить постоянное значение ко всем элементам - PullRequest
0 голосов
/ 08 июля 2019

У меня есть файл с каждой строкой в ​​следующем формате

KeyA=ValA1,ValA2,ValA3...ValAn 
KeyB=ValB1,ValB2,ValB3....ValBn

У меня есть несколько строк в этом файле с различным количеством значений для каждой строки.

Моя задача - добавить Val Key для каждой строки.Ожидаемый пример выходных данных:

ValA1 KeyA
ValA2 KeyA
ValA3 KeyA
ValB1 KeyB
ValB2 KeyB
ValB3 KeyB

То, что я пробовал:

while read -r line; do
    KEY=$(echo $line | cut -d '=' -f 1)
    VALUES=$(echo $line | cut -d '=' -f 2)
    for VAL in $VALUES;do
        echo $VAL $KEY
    done
done < file.txt

Я могу достичь ожидаемого результата, но я должен завершить это без использования цикла for,Может кто-нибудь предложить мне другое решение.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Не следует разбирать строчные текстовые файлы с циклами оболочки; Оболочка интерпретируется по одной строке за раз, когда программа читается. Это крайне неэффективно для массовых работ. Пожалуйста, используйте выделенные текстовые процессоры, такие как awk или perl.

awk -F'[=,]' '{k=$1; for(f=2;f<=NF;f++) print $f, k}' file
  • -F'[=,]' - поля разделяются одной запятой / равно
  • {...} - без каких-либо условий это действие будет выполняться в каждой строке
  • k=$1 - установите k в поле 1
  • for(f=2;f<=NF;f++) - перебрать все оставшиеся поля (NF = Количество полей)
  • print $f, k - вывести поле, пробел и значение k
1 голос
/ 08 июля 2019

Я получил это решение.Сначала замените пробел = и ,.Затем прочитайте каждую строку с помощью xargs и выполните сценарий, который буферизует первый аргумент (т. Е. Они ключ) и выводит с итерацией по всем остальным:

<inputfile tr '[=,]' ' ' |
xargs -l  sh -c 't="$1"; shift; printf "$t %s\n" "$@"' --

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

while IFS== read -r key vals; do
  printf "%s" "$vals" |
  xargs -d, printf "$key %s\n"
done <inputfile 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...