【问题标题】:Maximum of the differences using shell script or awk使用 shell 脚本或 awk 的最大差异
【发布时间】:2020-06-30 07:25:34
【问题描述】:

我有几个文件,每个文件都有两列,其中包含一些错误数据作为大的负值。

file_1.txt

3       4
4       5
2       4
-10023  -9821
4       7
9       1
3       5
3       4

file_2.txt

6       2
4       5
2       4
-98323  -83432
-208932 4
7       17
20      3
20      2

file_3.txt

4       4
2       4
2       4
-129923 -1209923
2       3
12      3
2       4
7       1

我想在不考虑错误数据的情况下打印上述文件中第 1 列和第 2 列之间差异的最大值。简单来说,

Maximum [ ($1 - $2) file*.txt ]

期望的输出

ofile.txt
4
-1
-2
-99999
-1
9
17
18

【问题讨论】:

  • but not getting the result. 但你有什么收获吗?你得到什么? I would like to replace all the wrong values with -99999 所以...添加else print -99999?或者像print A 一样打印,然后在将文件合并到if ($1 == "A" || $2 == "A"...) print -999999 时。
  • 所有负数的行都是你不想考虑的吗?
  • 您的算法中有 几个步骤(命令)。那么,哪一步首先给出了错误的结果?这不是最后一步,它只打印文件file*.txt 中的最大值吗?所以这个问题与“最大差异”完全无关。另请注意,file*.txt 不仅匹配生成的文件 file1.txtfile2.txtfile3.txt,还匹配您的原始文件 file_1.txtfile_2.txtfile_3.txt,这可能不是你想要的。
  • 为了完整起见,您应该在样本数据中包含一些您不想希望排除的负数行。
  • 所有输入文件的行数都一样吗?

标签: linux shell awk


【解决方案1】:

以下内容一次性处理您的示例输入(假设所有数据文件具有相同的行数):

$ awk '$1 > -1000 && $2 > -1000 {
         d = $1 - $2
         if (FNR in diffs) {
           if (diffs[FNR] < d)
             diffs[FNR] = d
         } else {
           diffs[FNR] = d
         }
       }
       END {
         for (n = 1; n <= FNR; n++) {
           if (n in diffs)
             print diffs[n]
           else 
             print -99999
         }
       }' file_*.txt
4
-1
-2
-99999
-1
9
17
18

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多