1

试图将数据合并到某些字段匹配的一行中。

12345,this,is,one,line,1
13567,this,is,another,line,3
14689,and,this,is,another,6
12345,this,is,one,line,4
14689,and,this,is,another,10

输出

12345,this,is,one,line,1,4
13567,this,is,another,line,3
14689,and,this,is,another,6,10

谢谢

4

2 回答 2

2
awk -F',' '{if($1 in a) {a[$1]=a[$1] "," $NF} else {a[$1]=$0}} END {asort(a); for(i in a) print a[i]}' < input.txt

适用于给定的示例。

这是同一 awk 脚本parse.awk的注释文件版本。请记住,此版本仅使用第一个字段作为统一行指示器。我将根据上面作者的评论重写它(除最后一个之外的所有字段)。

#!/usr/bin/awk -f

BEGIN { # BEGIN 部​​分在输入文件内容之前执行一次
    FS="," # 输入字段分隔符是逗号(可以在命令行中使用 -F 参数设置)
}

{ # main 部分在每个输入行上执行
    if($1 in a) { # 检查数组 'a' 是否已经包含一个在第一个字段中具有索引的元素
        a[$1]=a[$1] "," $NF # 如果条目已经存在,则连接当前行的最后一个字段
    }
    else { # 如果此行包含新条目
        a[$1]=$0 # 将其添加为新的数组元素
    }
}

END { # END 段在最后一行之后执行一次
    asort(a) # 对我们的数组 'a' 进行排序
    for(i in a) print a[i] # 这个循环遍历排序数组并打印它的内容
}

通过使用这个

./parse.awk input.txt

这是另一个版本,它使用除最后一个字段之外的所有字段来比较行:

#!/usr/bin/awk -f

BEGIN { # BEGIN 部​​分在输入文件内容之前执行一次
    FS="," # 输入字段分隔符是逗号(可以在命令行中使用 -F 参数设置)
}

{ # main 部分在每个输入行上执行
    idx="" # 重置索引变量
    for(i=1;i<NF;++i) idx=idx $i # 加入除最后一个字段之外的所有字段以创建索引
    if(idx in a) { # 检查数组'a'是否已经包含一个在第一个字段中具有索引的元素
        a[idx]=a[idx] "," $NF # 如果条目已经存在,则连接当前行的最后一个字段
    }
    else { # 如果此行包含新条目
        a[idx]=$0 # 将其添加为新的数组元素
    }
}

END { # END 段在最后一行之后执行一次
    asort(a) # 按值对数组 'a' 进行排序
    for(i in a) print a[i] # 这个循环遍历排序数组并打印它的内容
}

随意询问任何进一步的解释。

于 2012-07-22T06:18:25.413 回答
0

这可能对您有用(GNU sed 和排序):

sort -nt, -k1,1 -k6,6 file | 
sed ':a;$!N;s/^\(\([^,]*,\).*\)\n\2.*,/\1,/;ta;P;D'
于 2012-07-22T06:29:50.760 回答