如何在awk中有条件地筛选行

如何在awk中有条件地筛选行,awk,Awk,我不熟悉linux中的awk。我有一个1700万行的大文本文件。第一列是subjectID,第二列是Age。每个主题可能有多个年龄,我只想筛选每个主题的最小年龄,并将其打印在单独的文本文件中。我不确定这些科目是否从低到高排在第一列。。。以下是前几行: ID年龄 16214497 36.000 16214497 63.000 16214727 63.000 16214781 71.000 16214781 79.000 16214792 67.000 16214860 79.000

我不熟悉linux中的awk。我有一个1700万行的大文本文件。第一列是subject
ID
,第二列是
Age
。每个主题可能有多个年龄,我只想筛选每个主题的最小年龄,并将其打印在单独的文本文件中。我不确定这些科目是否从低到高排在第一列。。。以下是前几行:

ID年龄
16214497  36.000
16214497  63.000
16214727  63.000
16214781  71.000
16214781  79.000
16214792  67.000
16214860  79.000
16214862  62.000
16214874  61.000

如果文件未排序,则需要将记录保存在内存中以查找最小值。如果需要排序,这可能会更好

$ sed 1d file         |   # remove header
  sort -k1,1 -k2n     |   # sort by ID, then by age, numerically
  uniq -w8            |   # find the first unique record by ID only
  sed '1iID  Min_Age' |   # insert back the new header
  column -t               # pretty print

ID        Min_Age
16214497  36.000
16214727  63.000
16214781  71.000
16214792  67.000
16214860  79.000
16214862  62.000
16214874  61.000
尝试(仅使用不带管道的awk,使用内存保留值):


请阅读如何。您是否做了任何我们可以帮助的尝试,或者您只是希望有人帮您做?添加了每个步骤的说明谢谢…那么如何打印过滤文件(上面提到的内存)什么?我在awk的最后一行不是做了什么?我不明白你的问题,我想好了。所以如果我的文件名是x.txt,我应该做awk'NR=1{print;next}arr[$1]==0{arr[$1]=$2}}²($2$ awk ' NR=1{print; next} # ¹ arr[$1]==0 {arr[$1]=$2} # ² ($2 < arr[$1]) {arr[$1]=$2} # ³ END{for (i in arr) {print i, arr[i]}} # ⁴ ' file
awk 'NR=1{print; next} arr[$1]==0 {arr[$1]=$2} ($2 < arr[$1]) {arr[$1]=$2} END{for (i in arr) {print i, arr[i]}}' x.txt
ID          Age
16214497 36.000
16214727 63.000
16214781 71.000
16214792 67.000
16214860 79.000
16214862 62.000
16214874 61.000
$ tail +2 file | sort | awk '!seen[$1]++'
16214497  36.000
16214727  63.000
16214781  71.000
16214792  67.000
16214860  79.000
16214862  62.000
16214874  61.000