0

テキスト操作についてサポートが必要です。
私はこのようなデータを持っています:

29554 31109 "ENSG00000243485.1" 1555
29554 31097 "ENSG00000243485.1" 1543
29554 30039 "ENSG00000243485.1" 485
30564 30667 "ENSG00000243485.1" 103
30267 30667 "ENSG00000243485.1" 400
30976 31109 "ENSG00000243485.1" 133
89295 133566 "ENSG00000238009.2" 44271
89295 120932 "ENSG00000238009.2" 31637
120775 120932 "ENSG00000238009.2" 157
112700 112804 "ENSG00000238009.2" 104
92091 92240 "ENSG00000238009.2" 149
28269867 28269929 "ENSG00000248451.1" 62
28270383 28270486 "ENSG00000248 .1"103
28273195 28273372 "ENSG00000248451.1" 177
28275308 28275354 "ENSG00000248451.1" 46
.....................。

グループごとに最大の値を持つ行を印刷する必要があります。
4列目にグループ名があり、5列目に値があります。
私が想像するように、次のようになり
ます。1.グループを互いに分離します。
2.最大の価値を選択します。
3.行全体を印刷します。

この例の推奨出力は次のとおりです。

29554 31109 "ENSG00000243485.1" 1555
89295 133566 "ENSG00000238009.2" 44271
28273195 28273372 "ENSG00000248451.1" 177

誰かがawkまたはsedでこれを手伝ってくれることを願っています。

4

3 に答える 3

2

あなたはawkで一度だけファイルを通過する必要があります:

awk '
    $4 > val[$3] {val[$3] = $4; line[$3] = $0} 
    END {for (grp in line) print line[grp]}
' filename
于 2012-09-18T20:43:58.457 に答える
1

これはで行う必要がbashありawkます:

GROUPS=$(cut -d' ' -f3 datafile | uniq) # list of groups
for f in "$GROUPS"
do 
  # print line if 4th field is max
  awk -v "grp=$f" '$0 ~ grp && $4 > max {max=$4; line=$0} END {print line}' datafile
done
于 2012-09-18T16:54:59.507 に答える
1

これはあなたのために働くかもしれません:

cat -n file | sort -k4,4 -k5,5nr | sort -u -k4,4 | sort -n | cut -f2-
于 2012-09-18T20:08:37.380 に答える