文件:
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'
,但这似乎不起作用。
答案 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