gpt4 book ai didi

awk - 当特定列中的值更改时打印行

转载 作者:行者123 更新时间:2023-12-05 09:27:48 27 4
gpt4 key购买 nike

我有一个文件:

A 48
B 24
C 1
D 7
E 25
F 47
G 14
H 2
I 1

我想在第二列获得最低值时打印行,然后是最大值等(包括第一行和最后一行)。它看起来像一个变体:第一个值 -> 最低的一个值 -> 最大的 -> 最低的.. -> 最后的:

A 48
C 1
F 47
I 1

我想用awk。我可以打印最大(和最小)值

awk 'NR == 1 || $12 > max {number = $0; max = $12} END {if (NR) print number, max}' file.txt

但不是与变体对应的所有行。

有什么帮助吗?

最佳答案

首先,感谢您的好问题(继续)。

使用您显示的示例,请尝试按照 awk 编写一个Generic 程序,它将遍历整个 Input_file 并检查最小值并将根据它们在上一次出现的最低数字到下一次出现的最低数字之后的出现获得最小值。

awk -v min="" '
FNR==NR{
min=(min<$2?(min==""?$2:min):$2)
next
}
$2==min{
print arr[max] ORS $0
prevMax=max=""
}
{
max=(max>$2?max:$2)
if(prevMax!=max){
arr[max]=$0
}
prevMax=max
}
' Input_file Input_file

使用您显示的示例,输出如下:

A 48
C 1
F 47
I 1

说明:为上述代码添加详细说明。

awk -v min="" '                     ##Starting awk program from here, setting min value to NULL here.
FNR==NR{ ##Checking condition FNR==NR which will be TRUE when first time Input_file is being read.
min=(min<$2?(min==""?$2:min):$2) ##Getting minimum value among all the lines of Input_file.
next ##next will skip all further statements from here.
}
$2==min{ ##Checking condition if 2nd field is equal to min then do following.
print arr[max] ORS $0 ##printing array arr with index of max ORS and current line.
prevMax=max="" ##Nullifying prevMax and max here.
}
{
max=(max>$2?max:$2) ##Checking max value if current max is greater than $2 and assign $2 to it else keep max.
if(prevMax!=max){ ##If prevMax is NOT equal to max then do following.
arr[max]=$0 ##Setting current line to arr with index of max and value of current line.
}
prevMax=max ##Setting max to preMax here.
}
' Input_file Input_file ##Mentioning Input_file names here.

关于awk - 当特定列中的值更改时打印行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72093062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com