我使用此命令来比较两个文件并打印出 $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
由于您只对大于
old
最后一行的值感兴趣,因此无需查看该文件的其他行;只需读取完整的第一个文件并获取最后的 $1,因为它已经排序,然后与新文件中的 $1 进行比较。如果
old
未排序或者您只想保存该步骤,您可以执行以下操作:FNR==NR{ref=$1>ref ? $1 :引用;下一个}
如果您需要唯一地指定
new
中的值,您可以将其作为您已经执行的排序步骤的一部分来执行:排序 -t, -k 1,1 -n -u 新
关于shell - awk:比较两个包含数字的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74403249/