加入具有相似第一列的行

时间:2017-10-17 18:04:04

标签: unix awk

文件:

Async

预期产出:

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

我有一个标签分隔文件,如上所示。我想将行与具有相同第一列的逗号组合在一起。我知道如何组合这些行给我一个制表符分隔的第二列,但我希望第2列中的组合值用逗号分隔。这是我正在使用的命令:

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

我尝试将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 更改为-F'\t',但这似乎不起作用。

5 个答案:

答案 0 :(得分:1)

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列)和元素(","分隔的字符串)。

答案 1 :(得分:1)

这是另一个,采用分组输入文件

$ 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

答案 2 :(得分:1)

$ 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如果array(a)有索引,即$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

}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

简单地做。

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