【问题标题】:Comparing field#1 in two adjacent lines and printing fields#2 from all the lines where field#1 is identical比较两个相邻行中的字段#1,并从字段#1 相同的所有行中打印字段#2
【发布时间】:2015-10-18 03:52:38
【问题描述】:

可以被认为是 this bash question 的变体,我在这里问这个问题之前查了一下。

以下是一个示例文件:

C=b933cda8ce0/0 p=880080
C=b933cdd6580/0 p=880080
C=b933d02a240/0 p=880080
C=b933d059610/0 p=880080
C=b933d1c8690/0 p=880080
C=b933d2c1b60/0 p=1560315
C=b933d2c1b60/0 p=880080
C=b933d32f240/0 p=1229793
C=b933d32f240/0 p=123412

这里的输出应该是:

C=b933d2c1b60/0 p1=1560315 p2=880080
C=b933d32f240/0 p1=1229793 p2=123412

我需要从 field#1 匹配的所有行中打印出 field#2 与 field#1 的所有值。

虽然我使用下面的长单线完成了工作,但它对我来说似乎并不优雅/高效:

d=0; q=0; cat file |while read -r c p; do if [[ $c = $d ]]; then printf "$c\t$p\t$q\n"; fi; d=$c; q=$p; done

代码可以在任何标记的语言/工具中。

【问题讨论】:

  • 具有匹配字段一值的行是否总是这样相邻?
  • @EtanReisner 如果不是,我可以随时对它们进行排序。所以,是的。

标签: python bash perl awk sed


【解决方案1】:

求救

awk '{
  c[$1]++; 
  sub("p","p"c[$1],$2); 
  sep=(c[$1]>1)?FS:""; 
  a[$1]=a[$1] sep $2
} 
END {
  for(i in a) print i, a[i]
}' file

根据键(第一个字段)连接第二个字段。后缀 p 与参数的索引(在 c 中计算)。有一个格式化技巧,不要将第一个和第二个字段的间距加倍。

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2012-09-06
    • 2022-12-08
    • 1970-01-01
    相关资源
    最近更新 更多