【问题标题】:How can I sort set of points using awk or sed within a given interval如何在给定的时间间隔内使用 awk 或 sed 对一组点进行排序
【发布时间】:2016-09-03 22:18:15
【问题描述】:

如何使用 awk 或 sed 对包含一组点的以下 file.txt 进行排序

1.0   -0.6486
0.8   -0.2384
-0.2   0.0750
-0.2   0.0750
0.6    0.0754
0.4    0.3150
0.2    0.4985
0.1     0.5742
-0.1    0.7003
-0.2    0.7528
-0.4    0.8416
-0.6    0.9133
-0.8    0.9721
-1.0    1.0208

1.0     2.4600
0.8     2.5526
0.6     2.6431
0.4     2.7286
0.2     2.8070
0.1     2.8433
-0.1    2.9098
-0.2    2.9400
-0.4    2.9948
-0.6    3.0428
-0.8    3.0849
-1.0    3.1218

我想删除行 {-0.2, 0.0750} 和 (-0.2, 0.0750) 并将文件的最终形式为:

1.0   -0.6486
0.8   -0.2384
0.6    0.0754
0.4    0.3150
0.2    0.4985
0.1     0.5742
-0.1    0.7003
-0.2    0.7528
-0.4    0.8416
-0.6    0.9133
-0.8    0.9721
-1.0    1.0208

1.0     2.4600
0.8     2.5526
0.6     2.6431
0.4     2.7286
0.2     2.8070
0.1     2.8433
-0.1    2.9098
-0.2    2.9400
-0.4    2.9948
-0.6    3.0428
-0.8    3.0849
-1.0    3.1218

我需要一个脚本,它可以在 0.1 的步骤中检查从 1.0 到 -1.0 并删除任何不遵循降序的行,在这种情况下是两个点 -0.2 并将“排序”集写入一个新文件。 我是 Linux 新手。

【问题讨论】:

  • 如果您添加到目前为止您尝试过的内容,我们将不胜感激
  • sed 不是一个很好的工具。
  • 一个问题中有两个要求,而且没有有效的努力。嗯,投票结束这个问题是题外话。
  • 阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。您需要将 RS 设置为 null 和 `FS='\t' 以使用段落模式,并使用 PROCINFO["sorted_in"] 在每条记录中的字段上进行条件打印。在您尝试之后,如果您有任何问题,请告诉我们。

标签: bash shell awk sed grep


【解决方案1】:

首先,你的问题有一个问题,因为你说你想“删除任何不遵循降序的行”,但 -0.2 是从 0.8 减少的。但是如果你的意思是递减顺序是指“以 0.1 为步长”,那么还有另一个问题,那就是你的大多数数据点以 0.2 的步长递减,只有少数以 0.1 递减。

您的数据中未说明的要求是空行重置脚本,以便它再次从 1.0 开始。

所以我将您的问题参数化为“每个子列表中的 x 值必须减少 0.1 的 1 或 2 步”,并编写了以下 awk 一行(为清楚起见,我添加了换行符,但您可以离开他们像我一样直接从命令行使用它):

awk 'function NewList() {
         xPrev=1.0+delta
     };
     BEGIN {
         delta=0.1;
         maxSteps=2;
         epsilon=0.0000001;
         NewList()
     };
     NF {
         if (($1-epsilon <= xPrev - delta) && ($1+epsilon >= xPrev - delta*maxSteps)) {
             print;
             xPrev=$1
         }
         next
     };
     {
         NewList();
         print ""
     }'

请注意,“epsilon”变量绕过了计算机浮点数学的不准确性;没有它,由于与十进制值的微小(且未显示)差异,程序可能(在我的系统上)在几个点后停止打印输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多