Unix 基于另一列值将一列转换为行

Unix 基于另一列值将一列转换为行,unix,transpose,Unix,Transpose,我想根据另一列的值将一列转换为几个较小的部分,例如 1 ID1 V1 2 ID1 V2 3 ID1 V3 4 ID2 V4 5 ID2 V5 6 ID3 V6 7 ID3 V7 8 ID3 V8 9 ID3 V9 我希望每个ID的所有V值都在一行中,例如 ID1 V1 V2 V3 ID2 V4 V5 ID3 V6 V7 V8 V9 如示例所示,每个id都有不同数量的要转置的行。如果使用序列号列更容易执行此操作,则也可以 有人能帮忙

我想根据另一列的值将一列转换为几个较小的部分,例如

1 ID1  V1  
2 ID1  V2  
3 ID1  V3  
4 ID2  V4  
5 ID2  V5  
6 ID3  V6  
7 ID3  V7  
8 ID3  V8  
9 ID3  V9  
我希望每个ID的所有
V
值都在一行中,例如

ID1 V1 V2 V3  
ID2 V4 V5  
ID3 V6 V7 V8 V9
如示例所示,每个id都有不同数量的要转置的行。如果使用序列号列更容易执行此操作,则也可以


有人能帮忙吗?

如果您喜欢用Javascript编码,以下是如何使用jline在命令行上进行编码:


mmurphy@violet:~$cat,,,,| jline foreach'begin::global.all={}行::'fields=record.split(+/);if(fields.length==3)tm.incrementPath(all,fields.slice(1))'end:'tm.find(all,{maxdepth:1},function(path,val){console.log(path[0],Object.keys(val).join(“,”;})”
ID1v1、V2、V3
ID2V4,V5
ID3 V6、V7、V8、V9

其中输入为:

mmurphy@violet:~$cat,,,
1 ID1 V1
2 ID1 V2
3 ID1 V3
4 ID2 V4
5 ID2V5
6 ID3 V6
7 ID3 V7
8 ID3 V8
9 ID3 V9
mmurphy@violet:~$ 

说明:这将构建一个树,其中第一级分支是用户ID,第二级是V(版本?)。您可以对任何级别执行此操作。树叶只是柜台。首先,我们创建一个空树:

'begin::global.all={}

然后,输入的每一行被分成计数器、ID和版本号。计数器被切掉,只留下数组[userID,version]。incrementCounter在树中创建这些分支,有点像
mkdir-p
,并增加叶计数器,尽管您实际上不需要知道每个用户、版本组合出现的频率:


行::'fields=record.split(+/);if(fields.length==3)tm.incrementPath(all,fields.slice(1))'end:'tm.find(all,{maxdepth:1},function(path,val){console.log(path[0],Object.keys(val).join(“,”;})”

最后我们有了
tm.find
,它的行为就像UNIX find一样,并打印树中的每个路径。除此之外,我们将搜索的深度限制为所需的细分(1,但如果你像我一样,你将希望接下来对2、3、5或8个变量进行细分)。这样,您就可以将明细表和值列表分离出来,然后打印您的答案


如果您永远不需要更深入的故障,您可能会希望坚持使用awk,因为它可能是预装的。

这里有一个简单的awk one liner来实现这个技巧:

awk '1 {if (a[$2]) {a[$2] = a[$2]" "$3} else {a[$2] = $3}} END {for (i in a) { print i,a[i]}}' file.txt
输出:

ID1 V1 V2 V3
ID2 V4 V5
ID3 V6 V7 V8 V9

谢谢@pcantalupo,这非常简单,但也很棒!有没有办法使用另一个“密钥”文件来转置此文件?密钥文件有三列提供有关此文件的信息,即:“ID号”、“起始行”和“结束行”。e、 g.密钥文件的前三行如下所示:ID1 1 3 ID2 4 5 ID3 6 9等等。更新此问题或将其作为另一个问题发布