【问题标题】:join all lines that have the same first column to the same line将具有相同第一列的所有行连接到同一行
【发布时间】:2015-09-17 14:05:23
【问题描述】:

IE:

文件:

1234:abcd  
1234:930  
1234:999999  
194:keee  
194:284  
194:222222  

结果:

1234:abcd:930:999999  
194:kee:284:222222

据我所知,我已经用尽了我的大脑,无法想出办法。抱歉打扰各位了!

【问题讨论】:

标签: sorting unix join sed


【解决方案1】:
$ awk -F: '$1==last {printf ":%s",$2; next} NR>1 {print "";} {last=$1; printf "%s",$0;} END{print "";}' file
1234:abcd:930:999999
194:keee:284:222222

工作原理

  • -F:

    这告诉awk 使用: 作为字段分隔符。

  • $1==last {printf ":%s",$2; next}

    如果此行的第一个字段与最后一行的第一个字段相同,则打印一个冒号,后跟字段 2。然后,跳过其余命令并从下一行重新开始。

  • NR>1 {print "";}

    如果我们到达这里,这意味着该行的第一个字段有一个新的 not-seen-before 值。如果这不是第一行,我们通过打印换行符来结束最后一行。

  • {last=$1; printf "%s",$0;}

    用字段 1 的新值更新变量 last。然后,打印这一行。

  • END{print "";}

    到达文件末尾后,打印最后一个换行符。

合并不连续的行

考虑这个测试文件:

$ cat testfile2
3:abcd
4:abcd
10:123
3:999
4:999
10:123

应用这个 awk 脚本:

$ awk -F: '{a[$1]=a[$1]":"$2;} END{for (x in a) print x ":" substr(a[x],2);}' testfile2
3:abcd:999
4:abcd:999
10:123:123

在这种方法中,线条不一定以任何特定的顺序出现。如果顺序很重要,您可能希望将此输出通过管道传输到 sort。

【讨论】:

  • 嗯。在测试中,这与上面的文本一样,但由于某种原因,在真实文件(大约 200 万行相同)上它什么也没做。输出文件与输入完全相同。奇怪吗?
  • 3:abcd 4:abcd 5:abcd 6:abcd 7:abcd 8:abcd 9:abcd 10:123 11:abcd 12:abcd 13:abcd 14:abcd 15:abcd 16:abcd 17:abcd 18:abcd 19:abcd 20:abcd 3:999 4:999 5:999 6:999 7:999 8:999 9:999 10:123 11:999 12:999 13:999 14:999 15: 999 16:999 17:999 18:999 19:999 20:999
  • 看看它不起作用,有什么想法吗?很抱歉造成混乱
  • 对于您的新文件3:abcd 4:abcd 5:abcd...,与问题中的示例数据不同,每一行的第一列与前一行不同。这就是代码没有改变的原因。即使它们不是具有相同第一列的连续行,您是否要合并行?
  • @jahill2002 我刚刚在答案中添加了一种组合非连续行的方法。
猜你喜欢
  • 1970-01-01
  • 2017-06-14
  • 2012-06-17
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多