【问题标题】:Read array in Awk在 awk 中读取数组
【发布时间】:2020-01-25 00:50:37
【问题描述】:

创建了两个数组。我想打印数组 1 的第一条记录,然后打印数组 2 中与数组一个主键匹配的所有记录。主键是所有数组中的第三列。我也有一个列名。类似于交易报告。

数组 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

        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;


    }

【问题讨论】:

  • 没有bash awk 这样的东西。 bash 是一个 shell,可以从中调用各种命令(例如 sed、grep、awk)。 awk 是一个可以从 bash 或各种其他 shell 或操作系统(例如 UNIX bash、UNIX ksh、Windows)调用的命令。您是在询问 bash 数组或 awk 数组还是其他什么?还请像您的代码一样将您的示例输入/输出缩进 4 个空格,以便它清晰易读。
  • 感谢 Ed 的解释。我正在使用 awk 数组。
  • 在您的代码中显示您是如何填充数组的,而不是仅仅列出数组内容,因为根据您的问题和The primary key is the third column in all arrays 中的值行,您的数组是如何填充的并不清楚。跨度>
  • 记录是否按主键排序?
  • 你的问题比它应该的要混乱得多。您谈论 2 个数组并显示一些数据,告诉我们第 3 列是关键,然后说它实际上是第 4 列,提供访问 Array1 和 Array2 的代码,然后显示更多仅填充 1 个数组 Authorization_Arr 的代码,并使用不'在您发布的代码中的其他地方不存在这样做,等等。请发布一个清晰、简单、简洁、可测试的示例,其中包含示例输入文件、预期输出和用于填充数组的可执行代码.

标签: arrays loops awk


【解决方案1】:

我不是在寻找直接用于我的项目的实际代码,而只是寻找我将如何使用 awk 执行此操作的结构。

这是一种方法(需要 GNU awk 版本 4)。它首先收集按 key 分组的交易;此后,很容易为每个键打印它们。

#!/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]]
        }
      }

【讨论】:

  • 我得到错误:>>> Transaction_group[a[2]][
  • 你的awk是什么版本?
  • 我尝试更新循环可以像这样工作。 for (key in Authorization_Arr) { print Authorization_Arr[key] > "output.csv" for (i in LineItem_Arr) { (if Authorization_Arr[key,3]==LineItem_Arr[key,3]){ print LineItem_Arr[i] > "输出.csv" } } }
  • 我试图做的是检查事务数组的 3 字段是否与授权数组的 3 字段匹配。因此,我将打印与打印的授权记录关联的匹配交易。
  • 您的awk 版本是什么?
【解决方案2】:

可以这样工作。 for (key in Authorization_Arr) { print Authorization_Arr[key] > "output.csv" for (i in LineItem_Arr) { (if Authorization_Arr[key,3]==LineItem_Arr[key,3]){ print LineItem_Arr[i] > "输出.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"
            }
        }
      }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多