AWK - 匹配字段1,同一行中所有匹配列的粘贴字段2

时间:2018-04-09 15:36:21

标签: awk

我可以在Excel中执行以下操作,但效率非常低。有人可以帮助我在AWK中编写这个逻辑,因为它是我正在学习的文件解析语言吗?

逻辑

匹配字段1.在所有匹配的行中打印field1中的匹配字段值和字段4的每个值,包括正在匹配的行。

输入文件:

ASHBBPRJ01-ASHBBPRJ02-BE    ASHBBPRJ01.RD.AS    1   ASHBBBRJ01.RD.AS    ae1.0       strict
ASHBBPRJ01-ASHBBPRJ02-BE    ASHBBPRJ01.RD.AS    2   ASHBBPRJ02.RD.AS    ae1.0       strict
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBPRJ01.RD.AS    1   ASHBBBRJ01.RD.AS    ae1.0       strict
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBPRJ01.RD.AS    2   NYRKBBRJ02.RD.NY    ae5.0       strict
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBPRJ01.RD.AS    3   NYRKBBRJ01.RD.NY    ae2.0       strict
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBPRJ01.RD.AS    4   PROVBBRJ02.RD.RI    ae3.0       strict
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBPRJ01.RD.AS    5   PROVDSRJ02.RD.RI    ae0.0       strict
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBPRJ01.RD.AS    6   BSTNRCRJ01.RD.RI    ae2.0       strict
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBPRJ01.RD.AS    1   ASHBBBRJ01.RD.AS    ae1.0       strict
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBPRJ01.RD.AS    2   NYRKBBRJ02.RD.NY    ae5.0       strict
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBPRJ01.RD.AS    3   NYRKBBRJ01.RD.NY    ae2.0       strict
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBPRJ01.RD.AS    4   PROVBBRJ02.RD.RI    ae3.0       strict
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBPRJ01.RD.AS    5   PROVDSRJ02.RD.RI    ae0.0       strict
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBPRJ01.RD.AS    6   BSTNRCRJ02.RD.RI    ae1.0       strict

输出

ASHBBPRJ01-ASHBBPRJ02-BE    ASHBBBRJ01.RD.AS    ASHBBPRJ02.RD.AS
ASHBBPRJ01-BSTNRCRJ01-BE    ASHBBBRJ01.RD.AS    NYRKBBRJ02.RD.NY    NYRKBBRJ01.RD.NY    PROVBBRJ02.RD.RI    PROVDSRJ02.RD.RI    BSTNRCRJ01.RD.RI
ASHBBPRJ01-BSTNRCRJ02-BE    ASHBBBRJ01.RD.AS    NYRKBBRJ02.RD.NY    NYRKBBRJ01.RD.NY    PROVBBRJ02.RD.RI    PROVDSRJ02.RD.RI    BSTNRCRJ02.RD.RI

2 个答案:

答案 0 :(得分:1)

关注awk可能对您有帮助。

awk '{a[$1]=a[$1]?a[$1] OFS $4:$4} END{for(i in a){print i,a[i]}}'  Input_file

如果您想以相同的Input_file序列获取输出,那么以下内容可以帮助您。

awk '!b[$1]++{c[++i]=$1} {a[$1]=a[$1]?a[$1] OFS $4:$4} END{for(j=1;j<=i;j++){print c[j],a[c[j]]}}'  Input_file

答案 1 :(得分:1)

您的输入已经订购

$ awk '{if($1==p) line=line OFS $4; 
        else {if(line) print line; p=$1; line=$1 OFS $4}} 
    END{print line}' file