Читать массив в Awk - PullRequest
       7

Читать массив в Awk

0 голосов
/ 24 сентября 2019

Создано два массива.Я хотел бы напечатать первую запись массива 1, за которой следуют все записи массива 2, которые соответствуют первичному ключу массива 1.Первичный ключ - это третий столбец во всех массивах.У меня также есть имя столбца.Похож на транзакционный отчет.

Массив 1

content1, content2, primaryKey1, content1, content1
content2, content2, primaryKey2, content2, content2
content3, content3, primaryKey3, content3, content3

Массив 2

data1, data2, primaryKey1, data1, data1
data1, data2, primaryKey1, data1, data1
data1, data2, primaryKey1, data1, data1
data3, data3, primaryKey3, data3, data3
data3, data3, primaryKey3, data3, data3
data3, data3, primaryKey3, data3, data3
datat2, data2, primaryKey2, data2, data2
datat2, data2, primaryKey2, data2, data2

Вывод

**content1, content2, primaryKey1, content1, content1**
data1, data2, primaryKey1, data1, data1
data1, data2, primaryKey1, data1, data1
data1, data2, primaryKey1, data1, data1
**content2, content2, primaryKey2, content2, content2**
datat2, data2, primaryKey2, data2, data2
datat2, data2, primaryKey2, data2, data2
**content3, content3, primaryKey3, content3, content3**
data3, data3, primaryKey3, data3, data3
data3, data3, primaryKey3, data3, data3
data3, data3, primaryKey3, data3, data3

Вот то, что у меня пока есть, но я не могу понятькак сопоставить первичный ключ

{
    for (i in Array1) 
    print Array1[i] > "output.csv"; 

    {for (k in Array2) 

        printArray2[k] > "output.csv"; 
    }
}

Вот как я загружаю массив.Auth_num является первичным ключом.Файл не отсортирован, но я могу сделать команду сортировки до.Массив, который я предоставил, был просто примером.Не точно данные, но похожие структуры и макет.Массивы разделены запятыми.Поэтому моя цель - перечислить все транзакции под учетной записью.Например, первая строка массива 1 будет первой учетной записью, под которой я хотел бы перечислить все соответствующие строки в массиве, совпадающие по общему значению primarykey1.

while (getline < "'"$Authorization"'")
        {
            split($0,ft,",");

            Auth_num=ft[4];
            request_date=ft[5];
            status=ft[8];
            state=ft[9];

    Authorization_Arr[Auth_num]=Auth_header","Auth_num","request_date","status","state;

}           

Updated code but no luck with it
for (key in Authorization_Arr)
        {   # now print the data for each key
            print "**"Authorization_Arr[key]"**"

            for (i in LineItem_Arr[key]) {
             print LineItem_Arr[i]
            }
        }

Как я заполняю массив транзакций

while (getline <"'" $ LineItem "'") {</p>

        split($0,li,",");

        LI_Auth_num=li[4];      
        line_item_number=li[6];
        requested_from_date=li[7];
        requested_to_date=li[8];
        type=li[9];
        requested_date=li[10];
        determination_due_date=li[12];
        service_type=li[13];
        status=li[14];
        level_of_urgency=li[15];
        urgency_requested_by=li[16];
        primary_procedure=li[18];
        code=li[19];
        applied_eligibility=li[20];
        servicing_provider=li[21];
        provider_id=li[22];
        npi=li[23];
        in_network=li[24];
        servicing_provider_phone=li[26];
        place_of_service=li[28];
        comments=li[29];
        method=li[30];
        out_of_network_reason=li[31];
        preliminary_requested_units=li[33];
        request_source=li[34];
        determined_from_date=li[35];
        determined_to_date=li[36];
        determination=li[37];
        requested_units=li[39];
        recommended_units=li[40];
        determined_units=li[41];
        type_of_decision=li[42];


        LineItem_Arr[count]=LI_Auth_num","line_item_number","requested_from_date","type","requested_date","determination_due_date","service_type","status","level_of_urgency","urgency_requested_by","primary_procedure","code","applied_eligibility","servicing_provider","provider_id","npi","in_network","servicing_provider_phone","place_of_service","comments","method","out_of_network_reason","preliminary_requested_units","request_source","determined_from_date","determined_to_date","determination","requested_units","recommended_units","determined_units","type_of_decision;


    }

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

может что-то вроде этой работы.for (введите Authorization_Arr) {напечатать Authorization_Arr [key]> "output.csv" for (i в LineItem_Arr) {(если Authorization_Arr [key, 3] == LineItem_Arr [key, 3]) {напечатать LineItem_Arr [i]> "output.csv "}}}

Что-то вроде этого может работать, но мы не можем просто ссылаться на третий столбец в строке как …_Arr[key,3], так как строки не имеютбыл разделен и назначен для отдельных элементов массива.Также невозможно использовать одни и те же массивы для ключевых элементов, поскольку это приведет к тому, что итерации for (… in …_Arr) будут включать ключевые элементы.Итак, рабочий вариант вашего предложения - извлечь ключи в отдельные массивы:

#!/usr/bin/gawk -f
function extract_key(array, key)
{
    for (e in array)
    {   
        split(array[e], a, ", ")
        key[e] = a[3]
    }
}

BEGIN { # initialize sample data
        Authorization_Arr["primaryKey1"] = "content1, content2, primaryKey1, content1, content1"
        Authorization_Arr["primaryKey2"] = "content2, content2, primaryKey2, content2, content2"
        Authorization_Arr["primaryKey3"] = "content3, content3, primaryKey3, content3, content3"
        LineItem_Arr[1] = "data1, data2, primaryKey1, data1, data1"
        LineItem_Arr[2] = "data1, data2, primaryKey1, data1, data1"
        LineItem_Arr[3] = "data1, data2, primaryKey1, data1, data1"
        LineItem_Arr[4] = "data3, data3, primaryKey3, data3, data3"
        LineItem_Arr[5] = "data3, data3, primaryKey3, data3, data3"
        LineItem_Arr[6] = "data3, data3, primaryKey3, data3, data3"
        LineItem_Arr[7] = "datat2, data2, primaryKey2, data2, data2"
        LineItem_Arr[8] = "datat2, data2, primaryKey2, data2, data2"

        extract_key(Authorization_Arr, Authorization_key)
        extract_key(LineItem_Arr,      LineItem_key)
        for (key in Authorization_Arr)
        {   print Authorization_Arr[key] >"output.csv"
            for (i in LineItem_Arr)
            {   if (Authorization_key[key]==LineItem_key[i]) print LineItem_Arr[i] >"output.csv"
            }
        }
      }
0 голосов
/ 26 сентября 2019

Я не ищу фактически код, который непосредственно для моего проекта, а просто структуру того, как я бы сделал это с помощью awk.

Вот один из подходов (требуется GNU awk версии 4).Сначала он собирает транзакции, сгруппированные по ключу;после этого их легко распечатать для каждой клавиши.

#!/usr/bin/gawk -f
BEGIN { # initialize sample data
        Authorization_Arr["primaryKey1"] = "content1, content2, primaryKey1, content1, content1"
        Authorization_Arr["primaryKey2"] = "content2, content2, primaryKey2, content2, content2"
        Authorization_Arr["primaryKey3"] = "content3, content3, primaryKey3, content3, content3"
        Transaction_Arr[1] = "data1, data2, primaryKey1, data1, data1"
        Transaction_Arr[2] = "data1, data2, primaryKey1, data1, data1"
        Transaction_Arr[3] = "data1, data2, primaryKey1, data1, data1"
        Transaction_Arr[4] = "data3, data3, primaryKey3, data3, data3"
        Transaction_Arr[5] = "data3, data3, primaryKey3, data3, data3"
        Transaction_Arr[6] = "data3, data3, primaryKey3, data3, data3"
        Transaction_Arr[7] = "datat2, data2, primaryKey2, data2, data2"
        Transaction_Arr[8] = "datat2, data2, primaryKey2, data2, data2"

        for (i in Transaction_Arr)
        {   # collect the transaction indexes grouped by the key
            split(Transaction_Arr[i], a, ", ")
            Transaction_group[a[3]][length(Transaction_group[a[3]])+1] = i  # key is 3rd column
        }
        for (key in Authorization_Arr)
        {   # now print the data for each key
            print "**"Authorization_Arr[key]"**"
            for (i in Transaction_group[key]) print Transaction_Arr[Transaction_group[key][i]]
        }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...