如何在awk中有条件地筛选行
我不熟悉linux中的awk。我有一个1700万行的大文本文件。第一列是subject如何在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
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