加入线具有类似第一列
问题描述:
文件:加入线具有类似第一列
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列)和元素(","
分隔的字符串)。
答
的问题是它的多个空间,而不是标签
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
}
这工作很好。你介意解释你做了什么吗?最后,我最终使用了'awk'BEGIN {OFS =“\ t”} {A [$ 1] = A [$ 1] d [$ 1] $ 2; ([我在A])打印我,A [我]}''保留第一个标签 – cosmictypist
''不会保证输出将是在OP发布的订单中打印。 – batMan
是的。但是然后'|可以使用sort -k ...' –