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

mklgxw1f  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(159)

我使用这个命令来比较两个文件,并打印出其中$1不同的行:
awk -F, 'NR==FNR {exclude[$1];next} !($1 in exclude)' old.list new.list > changes.list
我正在处理的文件已使用-n按数字排序
old.list:

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

new.list

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

我正在寻找一种方法来调整我的命令,并使awk打印行只有当$1 from new.list不仅是唯一的,而且〉$1 from the last line of the old.list
预期结果:

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 }'
但我不确定能不能用这种方式
谢谢你

jckbn6z7

jckbn6z71#

您可以使用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块打印:

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最后一行的值感兴趣,因此甚至不需要查看该文件的其他行;
1.只需读取第一个文件的全部内容,并获取最后一个$1,因为它已经排序,然后与新文件中的$1进行比较。如果old没有排序,或者您只想保存该步骤,您可以执行以下操作:
FNR==NR{ref=$1>ref ? $1 : ref; next}
1.如果你需要唯一的new中的值,你可以在你已经在做的排序步骤中做:
sort -t, -k 1,1 -n -u new

ojsjcaue

ojsjcaue2#

单程awk解决方案:
第一个

jdgnovmf

jdgnovmf3#

由于两个文件都已排序,因此以下命令可能更有效:

awk -F, 'NR==FNR{x=$1}; $1>x{x=$1; print}' <(tail -n1 old) new
  • 它只读取old中的一行
  • 它只打印new.$1old[last].$1的行
  • 它只打印具有唯一$1的行

相关问题