用于数据组织的bash shell或awk脚本

时间:2018-08-03 22:11:39

标签: bash shell awk

我有两个这样的列数据:

*x y  
0 -3.9  
0.14 -4.32  
0.14 -4.5  
0.23 -3.95  
0.23 -3.8  
0.5 -4.1  
0.7 -4.3  
...  
1.0 -4.5*  

如您所见,某些x值相同。 如果x值相同,我想选择最低的y值。 因此,上述数据将像这样减少:

x y  
0 -3.9  
0.14 -4.5  
0.23 -3.95  
0.5 -4.1  
0.7 -4.3  
...  
1.0 -4.5  

有人知道如何通过简单的脚本来制作它吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您具有Datamash,则无需脚本。 sudo apt install datamash在基于debian的(Ubuntu)系统上。 pacman和其他“默认”程序包管理器存储库也倾向于将其作为可用程序包。

Khazad-dum:~/test£ cat thingy
0 -3.9
0.14 -4.32
0.14 -4.5
0.23 -3.95
0.23 -3.8
0.5 -4.1
0.7 -4.3

告诉datamash按空格进行列化,按列1分组,并打印列2的最小值:

Khazad-dum:~/test£ datamash -W -g 1 min 2 <thingy
0       -3.9
0.14    -4.5
0.23    -3.95
0.5     -4.1
0.7     -4.3

以下awk将起作用,直到第2列包含正值。您需要修改if语句,以检查是否存在该键。读者的练习:“如何判断awk关联数组是否包含键”(c1是关联数组...列1 / $1是键)

awk '{if (c1[$1] > $2) {c1[$1] = $2}} END {for (key in c1) {print key "  " c1[key]}}' thingy

答案 1 :(得分:-1)

我找到了想要的答案:

sort -k1,1n -k2,2g file | awk '!a[$1] {a[$1] = $2} $2 == a[$1]'