温馨提示:本文翻译自stackoverflow.com,查看原文请点击:bash - Building table from list using nearest value?
awk bash grep perl sed

bash - 使用最接近的值从列表构建表?

发布于 2020-04-12 19:01:30

我有类似的清单...

1ID:42
2ID:85853
Name:Chris
Age:99
Species:Monkey
Name:Bob
Age:23
Species:Fish
Name:Alex
Age:67
Species:Cat
1ID:987
2ID:775437
Name:Tiffany
Age:32
Species:Dog
1ID:777
2ID:65336
Name:Becky
Age:122
Species:Hippo

我想创建一个表,其中一些数据取自最近的结果。这样可以防止我简单地替换“ \ n”,“名称:”等来创建表。

这就是我要结束的...

Chris 99 Monkey 42 85853
Bob 23 Fish 42 85853
Alex 67 Cat 42 85853
Tiffany 32 Dog 987 775437
Becky 122 Hippo 777 65336

我希望这是有道理的。最后2列取自最近的先前1ID和2ID。“ ID”值之后可以有任意多个条目。

查看更多

提问者
Chris
被浏览
53
markp-fuso 2020-02-03 04:11

假设:

  • 数据总是按照显示的格式进行格式化,并且总是有完整的三元组名称/年龄/种类
  • 每行的第一个字段的拼写/大写都与示例中的完全相同(解决方案基于完全匹​​配)

样本数据文件:

$ cat species.dat
1ID:42
2ID:85853
Name:Chris
Age:99
Species:Monkey
Name:Bob
Age:23
Species:Fish
Name:Alex
Age:67
Species:Cat
1ID:987
2ID:775437
Name:Tiffany
Age:32
Species:Dog
1ID:777
2ID:65336
Name:Becky
Age:122
Species:Hippo

一种awk解决方案:

awk -F":" '
$1 == "1ID"     { id1=$2  ; next }
$1 == "2ID"     { id2=$2  ; next }
$1 == "Name"    { name=$2 ; next }
$1 == "Age"     { age=$2  ; next }
$1 == "Species" { print name,age,$2,id1,id2 }
' species.dat

注意:这些next子句是可选的,因为每一行都与字段1($1)中的特定值匹配

运行上面的命令会生成:

Chris 99 Monkey 42 85853
Bob 23 Fish 42 85853
Alex 67 Cat 42 85853
Tiffany 32 Dog 987 775437
Becky 122 Hippo 777 65336