对列进行分组并在 shell 中获取特定值
group columns and get specific value in shell
我有一个文件,其中我必须对第 1、2 和 3 列进行分组,对第 7 列求和,获取计数,并获取具有最新日期时间的第 4 列和第 5 列(第 6 列)。
FILE.txt
AAA,BBB,CCC,OOO,PPP,20170117012006,12
XXX,YYY,MMM,OOO,PPP,20170117012006,13
AAA,BBB,CCC,III,TTT,20170117020006,14
XXX,YYY,MMM,OOO,PPP,20170117022067,10
预期输出
AAA,BBB,CCC,III,TTT,26,2
XXX,YYY,MMM,OOO,PPP,23,2
我这里有一个代码,但只对第 1、2、3 列进行了分组。
awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[,,]+= }{arr2[,,]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt
使用额外的数组来保存每个组的最新信息。
awk 'BEGIN { FS=OFS=SUBSEP="," }
{
arr[,,]+=;
arr2[,,]++;
if ( > latest[,,]) {
latest[,,] = ;
latest_data[,,] = OFS ;
}
}
END {for (i in arr) print i,arr[i],arr2[i],latest_data[i]}' FILE.txt
awk -F"," '
{
i=","","
if (i in a) {
split(a[i],r,",")
+=r[4]
c=r[5]+1
if (r[1] > ) { =r[2]; =r[3]; =r[1] }
} else { c=1 }
a[","","]=","","","","c
} END { for (i in a) { print i substr(a[i],15) }}
' file
AAA,BBB,CCC,III,TTT,26,2
XXX,YYY,MMM,OOO,PPP,23,2
如果您想要对第 1、2 和 3 列进行排序,请改用它
END { asorti(a,b); for (i in b) { print b[i] substr(a[b[i]],15) }}
@User101:尝试以下操作,它将为您提供 expected/requested 输出以及与每个 Input_file 相同的相同序列 $1、$2、$3。
awk -F, 'FNR==NR{A[,,]=A[,,]?A[,,]+:;;B[,,]++;next} ((,,) in A){$NF="";print [=10=] A[,,] "," B[,,];delete A[,,]}' OFS=, SUBSUP=, Input_file Input_file
将字段分隔符设为“,”。当读取第一个文件时,FNR==NR 将为 TRUE。创建名为 A 的数组,其索引为 $1,$2,$3 并将 $7 的值连接到它。再创建一个名为 B 的数组,其索引也是 $1,$2,$3 以计算 $1,$2,$3.
然后检查 A 中的 ($1,$2,$3),如果数组 A 中存在第一、第二、第三个字段,如果是,则打印当前行(我们已将其最后一个字段设为 NULL)以及数组 A和数组 B 的值根据请求。
编辑: 添加 non-one 线性形式的解决方案现在太成功了。
awk -F, 'FNR==NR{
A[,,]=A[,,]?A[,,]+:;
B[,,]++;
next
}
((,,) in A){
$NF="";
print [=11=] A[,,] "," B[,,];
delete A[,,]
}
' OFS=, SUBSUP=, Input_file Input_file
我有一个文件,其中我必须对第 1、2 和 3 列进行分组,对第 7 列求和,获取计数,并获取具有最新日期时间的第 4 列和第 5 列(第 6 列)。
FILE.txt
AAA,BBB,CCC,OOO,PPP,20170117012006,12
XXX,YYY,MMM,OOO,PPP,20170117012006,13
AAA,BBB,CCC,III,TTT,20170117020006,14
XXX,YYY,MMM,OOO,PPP,20170117022067,10
预期输出
AAA,BBB,CCC,III,TTT,26,2
XXX,YYY,MMM,OOO,PPP,23,2
我这里有一个代码,但只对第 1、2、3 列进行了分组。
awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[,,]+= }{arr2[,,]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt
使用额外的数组来保存每个组的最新信息。
awk 'BEGIN { FS=OFS=SUBSEP="," }
{
arr[,,]+=;
arr2[,,]++;
if ( > latest[,,]) {
latest[,,] = ;
latest_data[,,] = OFS ;
}
}
END {for (i in arr) print i,arr[i],arr2[i],latest_data[i]}' FILE.txt
awk -F"," '
{
i=","","
if (i in a) {
split(a[i],r,",")
+=r[4]
c=r[5]+1
if (r[1] > ) { =r[2]; =r[3]; =r[1] }
} else { c=1 }
a[","","]=","","","","c
} END { for (i in a) { print i substr(a[i],15) }}
' file
AAA,BBB,CCC,III,TTT,26,2
XXX,YYY,MMM,OOO,PPP,23,2
如果您想要对第 1、2 和 3 列进行排序,请改用它
END { asorti(a,b); for (i in b) { print b[i] substr(a[b[i]],15) }}
@User101:尝试以下操作,它将为您提供 expected/requested 输出以及与每个 Input_file 相同的相同序列 $1、$2、$3。
awk -F, 'FNR==NR{A[,,]=A[,,]?A[,,]+:;;B[,,]++;next} ((,,) in A){$NF="";print [=10=] A[,,] "," B[,,];delete A[,,]}' OFS=, SUBSUP=, Input_file Input_file
将字段分隔符设为“,”。当读取第一个文件时,FNR==NR 将为 TRUE。创建名为 A 的数组,其索引为 $1,$2,$3 并将 $7 的值连接到它。再创建一个名为 B 的数组,其索引也是 $1,$2,$3 以计算 $1,$2,$3.
然后检查 A 中的 ($1,$2,$3),如果数组 A 中存在第一、第二、第三个字段,如果是,则打印当前行(我们已将其最后一个字段设为 NULL)以及数组 A和数组 B 的值根据请求。
编辑: 添加 non-one 线性形式的解决方案现在太成功了。
awk -F, 'FNR==NR{
A[,,]=A[,,]?A[,,]+:;
B[,,]++;
next
}
((,,) in A){
$NF="";
print [=11=] A[,,] "," B[,,];
delete A[,,]
}
' OFS=, SUBSUP=, Input_file Input_file