使用AWK将两条线合并为一条

使用AWK将两条线合并为一条,awk,Awk,我有一个以下格式的文件 Time Number Val x 1 y x 1 y a 1 z b 1 m b 2 m 我想用相同的值合并行,最后的文件应该是这样的 Time Number Val x 2 y a 1 z b 3 m 如何使用awk执行此操作?您可以使用awk的关联数组: awk 'NR==1{print $0} NR!=1{a[$1

我有一个以下格式的文件

 Time Number Val
  x    1     y
  x    1     y
  a    1     z
  b    1     m
  b    2     m
我想用相同的值合并行,最后的文件应该是这样的

 Time Number Val
  x    2     y
  a    1     z
  b    3     m

如何使用awk执行此操作?

您可以使用awk的关联数组:

awk 'NR==1{print $0} NR!=1{a[$1]+=$2; b[$1]=$3;} \
 END{ for ( i in a)  print i, a[i], b[i]}' file
对于示例输入,它将打印:

Time Number Val
x 2 y
a 1 z
b 3 m

计算所有重复的
时间
Val
组合:

awk 'NR>1{a[$1,$3]+=$2;next}$1=$1;END{for(k in a){split(k,s,SUBSEP);print s[1],a[k],s[2]}}' OFS="\t" file
Time    Number  Val
a       1       z
b       3       m
x       2       y

这将中断具有不同值的重复时间。它假定
Val
对于相应的
time
(基于示例输入)是唯一的。如果
Val
列对于相同的
Time
值将有不同的值,则没有逻辑方法将第二列相加。OP必须澄清,如果第二列在
Val
中重复了相同的
Time
,他希望计算第二列的标准。逻辑方法是将字段1和3视为一个键。。我们将看到OP在这种情况下想要什么。如果F1+F3被视为单个键,那么当F3不是唯一的wrt F1时,F1将在最终输出中具有重复项。我怀疑这是OP想要的。我想这就是OP想要的@Vishal?如果您认为不应该像OP所说的那样使用$3作为键,那么我想用相同的值加入行?那么案例呢
x1n
?这是一个重复的
时间
,具有不同的
Val
@KingsIndian和我的回答对这个案例的处理不同。最小化分隔符问题:
a[$1,$3]+=$2
然后
split(k,s,subsp)