如何在多个文件的特定列中查找最小值的记录?

时间:2019-05-04 05:57:10

标签: awk

我有2列4000 dat文件。从每个文件中,我需要确定第2列的第一个最小值,并打印相应的行。然后,它将在文件夹中的多个文件上运行,并将这些值附加到新文件中。我已经尝试过下面的代码。

文件名包括公用字符串:

fig_3-28333.dat
      ^^^^^ file number
awk'BEGIN{min=0}{if(($2)>min)  min=($2)}END {print line}' cat >> new.dat

预计输出文件为

file number Column 1 column2
28333           x value  first minimum value
28334           x value  first minimum value

1 个答案:

答案 0 :(得分:0)

注意:这仅适用于gawk(可以理解ENDFILE模式),不适用于常规的awk

这是我的脚本 min.awk

BEGIN {
    print "file number Column 1 column2"
}

FNR == 1 {
    min = $2;
    first = $1
    second = $2
}

$2 < min {
    min = $2
    first = $1
    second = $2
}

ENDFILE {
    # Extract the file number to a[1]
    match(FILENAME, /.*-([0-9]+)\.dat/, a)  
    print a[1], first, second
}

注释

  • BEGIN模式打印标题
  • 在每个文件的第一行(模式:FNR == 1),确定最小值
  • 对于第二个值小于最小值(模式:$2 < min)的那些行,确定新的最小值
  • 在每个文件末尾,打印出该文件的最小值

调用脚本

gawk -f min.awk *.dat

更新

查看脚本后,我复制了代码,可以通过合并两个代码块消除这些代码:

BEGIN {
    print "file number Column 1 column2"
}

FNR == 1 || $2 < min{
    min = $2;
    first = $1
    second = $2
}

ENDFILE {
    # Extract the file number to a[1]
    match(FILENAME, /.*-([0-9]+)\.dat/, a)  
    print a[1], first, second
}