我使用这个命令来比较两个文件,并打印出其中$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 }'
但我不确定能不能用这种方式
谢谢你
3条答案
按热度按时间jckbn6z71#
您可以使用awk,然后通过
sort
将数值从高到低排序,然后通过head
获得第一个:或者,使用第二遍查找awk中的最大值,并使用END块打印:
一边喝咖啡一边阅读你的编辑,就这样做:
1.由于您只对大于
old
最后一行的值感兴趣,因此甚至不需要查看该文件的其他行;1.只需读取第一个文件的全部内容,并获取最后一个$1,因为它已经排序,然后与新文件中的$1进行比较。如果
old
没有排序,或者您只想保存该步骤,您可以执行以下操作:FNR==NR{ref=$1>ref ? $1 : ref; next}
1.如果你需要唯一的
new
中的值,你可以在你已经在做的排序步骤中做:sort -t, -k 1,1 -n -u new
ojsjcaue2#
单程
awk
解决方案:第一个
jdgnovmf3#
由于两个文件都已排序,因此以下命令可能更有效:
old
中的一行new.$1
〉old[last].$1
的行$1
的行