加入线具有类似第一列

问题描述:

文件:加入线具有类似第一列

A 20 
A 35 
B 13 
C 14 
C 49 
C 58 

预期输出:

A 20,35 
B 13 
C 14,49,58 

我有个制表符分隔的文件如上述。我想将行与第一列相同的逗号组合。我知道如何组合这些行来给我一个制表符分隔的第二列,但是我希望第2列中的组合值用逗号分隔。这是我用的命令:我试图改变-F'\t'-F','

LC_ALL='C' awk -F'\t' -v OFS='\t' '{x=$1;$1="";a[x]=a[x]$0}END{for(x in a)print x,a[x]}' input.txt > output.txt 

,但似乎并没有工作。

awk '{ A[$1] = A[$1] d[$1] $2; d[$1] = ","} 
END {for (i in A) print i, A[i]}' input.txt > output.txt 

说明A[$1] = A[$1] d[$1] $2; - 将设置相关联的数组索引$1和值A[$1] d[$1] $2。最初它将等于$2,因为A[$1]d[$1]未定义。 d[$1]存储输出分隔符","

END块在循环中打印数组索引(唯一的第1列)和元素(","分隔的字符串)。

+0

这工作很好。你介意解释你做了什么吗?最后,我最终使用了'awk'BEGIN {OFS =“\ t”} {A [$ 1] = A [$ 1] d [$ 1] $ 2; ([我在A])打印我,A [我]}''保留第一个标签 – cosmictypist

+0

''不会保证输出将是在OP发布的订单中打印。 – batMan

+0

是的。但是然后'|可以使用sort -k ...' –

的问题是它的多个空间,而不是标签

awk -F'[[:space:]][[:space:]]+' -v OFS=' ' '{if(a[$1])a[$1]=a[$1]","$2; else a[$1]=$2;}END{for (i in a)print i, a[i];}' input.txt > output.txt 

简单地做。

awk '{(a[$1])?a[$1]=a[$1]","$2:a[$1]=$2} END{for (i in a) print i"\t"a[i]}' infile 

这里是另一个,需要一个分组输入文件

$ awk -v OFS=, 'function pr() {if(p2) print p2; p1=$1; p2=$0} 
           {if($1==p1) p2=p2 OFS $2; else pr()} 
       END   {pr()}' file 

A  20,35 
B  13 
C  14,49,58 

$ cat infile 
A 20 
A 35 
B 13 
C 14 
C 49 
C 58 

$ awk '{a[$1]=($1 in a ? a[$1] ",":"") $2}END{for(i in a)print i,a[i]}' infile 
A 20,35 
B 13 
C 14,49,58 

说明:

  • a[$1]a是阵列,$1是第一场,用作阵列键/索引
  • $1 in a if array(a)has index,which is $1那么我们得到的逻辑真状态
  • a[$1] ","如果上一步中状态为真,那么对于这样的索引阵列a的内容将与第二场连接起来,否则:""只是第二场,当数组有没有这样的指标。
  • for(i in a)print i, a[i]遍历阵列a,和可变i作为键, 打印数组键和值。

a[$1]=($1 in a ? a[$1] ",":"") $2可以写成如下,以便更好地阅读/理解初学者。

# if array a seen index $1 before then 
if($1 in a){ 

    # append with existing data 
    a[$1] = a[$1] "," $2 

# else 
}else{ 

    # did not see before, lets just set new data 
    a[$1] = $2 

}