我正在使用此命令比較兩個檔案并列印出 $1 不同的行:
awk -F, 'NR==FNR {exclude[$1];next} !($1 in exclude)' 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 ($1 從 old.list 的最后一行)??,30615,50,874,00.2 不會被列印,因為 30615 是 new.list 唯一的,但它也 < 30620 ($1 從old.list 的最后一行)
awk -F, '{if ($1 #from new.list > $1 #from_the_last_line_of_old.list) print }'
類似的東西,但我不確定它可以這樣做嗎?
謝謝
uj5u.com熱心網友回復:
您可以使用您擁有的 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
由于您只對大于最后一行的值感興趣,因此
old甚至無需查看該檔案的其他行;只需閱讀完整的第一個檔案并獲取最后一個 $1,因為它已經排序,然后與新檔案中的 $1 進行比較。如果
old未排序或者您只想保存該步驟,您可以執行以下操作:FNR==NR{ref=$1>ref ? $1 : ref; next}如果您需要唯一的值,
new您可以將其作為您已經在執行的排序步驟的一部分:sort -t, -k 1,1 -n -u new
uj5u.com熱心網友回復:
單程awk解決方案:
mawk 'BEGIN { ___ = log(!(_^= FS = ",")) # set def. value to -inf } NR==FNR ? __[___=$_] : ($_ in __)<( ___< $_)' old.txt new.txt
30690,10,87,0.021
30800,20,97,1.021
uj5u.com熱心網友回復:
由于兩個檔案都已排序,因此此命令可能更有效:
awk -F, 'NR==FNR{x=$1}; $1>x{x=$1; print}' <(tail -n1 old) new
- 它只讀取一行
old - 它只列印
new.$1>old[last].$1 - 它只列印具有唯一性的行
$1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/533138.html
標籤:壳awk
