shell - awk:比较两个包含数字的文件

标签 shell awk

我使用此命令来比较两个文件并打印出 $1 不同的行:

awk -F, 'NR==FNR {exclude[$1];next} !(排除中的 $1)' old.list new.list >changes.list

我正在使用的文件已使用 -n 按数字排序

旧列表:

30606,10,57561
30607,100,26540
30611,300,35,5.068
30612,100,211,0.035
30613,200,5479,0.005
30616,100,2,15.118
30618,0,1257,0.009
30620,14,8729,0.021

新列表

30606,10,57561
30607,100,26540
30611,300,35,5.068
30612,100,211,0.035
30613,200,5479,0.005
30615,50,874,00.2
30616,100,2,15.118
30618,0,1257,0.009
30620,14,8729,0.021
30690,10,87,0.021
30800,20,97,1.021

结果

30615,50,874,00.2
30690,10,87,0.021
30800,20,97,1.021

我正在寻找一种方法来调整我的命令,并仅当 new.list 中的 $1 不仅是唯一的,而且是 old.list 最后一行中的 $1 时才进行 awk 打印行

预期结果:

30690,10,87,0.021
30800,20,97,1.021

因为 30690 和 30800 ($1) > 30620 (old.list 最后一行的 $1) 在这种情况下,30615,50,874,00.2不会被打印,因为30615对于new.list来说无疑是唯一的,但它也是<30620(来自old.list最后一行的$1)

awk -F, '{if ($1 #from new.list > $1 #from_the_last_line_of_old.list) print }'

类似的东西,但我不确定可以这样做吗?

谢谢

最佳答案

您可以使用现有的 awk,然后通过管道通过 sort 将数字从高到低排序,然后通过管道到 head 获取第一个:

awk -F, 'FNR==NR{seen[$1]; next} !($1 in seen)' old new | sort -nr | head -n1
30690,10,87,0.021

或者,使用第二遍查找 awk 中的最大值和要打印的 END block :

awk -F, 'FNR==NR{seen[$1]; next} 
(!($1 in seen)) {uniq[$1]=$0; max= $1>max ? $1 : max}
END {print uniq[max]}' old new 
30690,10,87,0.021

喝杯咖啡,阅读您编辑的内容,只需执行以下操作:

awk -F, 'FNR==NR{ref=$1; next} $1>ref' old new
30690,10,87,0.021
30800,20,97,1.021
  1. 由于您只对大于 old 最后一行的值感兴趣,因此无需查看该文件的其他行;

  2. 只需读取完整的第一个文件并获取最后的 $1,因为它已经排序,然后与新文件中的 $1 进行比较。如果 old 未排序或者您只想保存该步骤,您可以执行以下操作:

    FNR==NR{ref=$1>ref ? $1 :引用;下一个}

  3. 如果您需要唯一地指定 new 中的值,您可以将其作为您已经执行的排序步骤的一部分来执行:

    排序 -t, -k 1,1 -n -u 新

关于shell - awk:比较两个包含数字的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74403249/

相关文章:

linux - 如何在 shell 脚本中等待模块加载完成?

Bash shell 脚本 : "syntax error near unexpected token ` fi'"

awk - 如何仅解析具有不同分隔符的一列?

bash - 从日志文件中提取特定单词

csv - awk:如何过滤掉所有条目(16 列)都为 0 的行

python - 检索 Python 中的命令行参数

linux - 为什么我的 `-d filename` 和 `d---------` 有不同的输出?

linux - 在 Fish Shell 中,Ctrl Right 和 Ctrl Left 不会从一个单词移动到另一个单词

linux - Shell 编程变量不会进入 if 或 case 语句

regex - Grep 每行中第一次出现的位置