乗算で表される2番目の変数から最大値を持つ行を抽出する

乗算で表される2番目の変数から最大値を持つ行を抽出する

解決できないような問題があります。

次のようなタブで区切られた巨大なテキストファイルがあります。

chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

必要なものは次のとおりです。 1)すべての一意の行を抽出する2)列5が複数回表示される場合(例:b)、列4に最大値がある行。

したがって、上記の例で必要な行は次のようになります。

10月20日20日(これはユニークな行です)
30 40 15b(5列が複数回表現される場合、4列で値が最大の行になります。

これを行う簡単な方法はありますか?

答え1

それでは、行を5番目の列にグループ化し、各グループに最大4番目の列を持つ行を印刷しますか?

負の数がないと仮定すると、次のようになります。

$ awk '$4 > val[$5] {val[$5] = $4; line[$5] = $0} 
       END {for (x in line) print line[x] }' < foo.txt
chr 10 20 20 a       
chr 30 40 15 b

答え2

はい.txt

chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

パスワード

 awk '$5== "a" {print $0}' l.txt | sort -k4 -nr | sed -n '1p' ; awk '$5=="b" {print $0}' l.txt | sort -k4  -nr | sed -n '1p'

出力

chr 10 20 20 a
chr 30 40 15 b

答え3

私は次のように書くでしょう:

awk '
    NR == FNR {count[$5]++; if ($4 > max[$5]) max[$5] = $4; next} 
    count[$5] > 1 && $4 == max[$5] && !seen[$0]++
' file file
chr 30 40 15 b

ファイルを2回処理します。

  • 最初に、5番目のフィールドの発生頻度を計算し、各5番目のフィールド値に対して最大の4番目のフィールドを見つけます。
  • 次に、次の基準に従って作業してください。
    • 5番目のフィールドの発生のみ複数回記録し、
    • 最大の4番目のフィールドを持つレコードのみを含み、
    • 唯一無二の記録

数が 1 の行を表示するには、単に次のように書くことができます。

awk 'NR == FNR {if ($4 > max[$5]) max[$5]=$4; next} $4==max[$5] && !seen[$0]++' file file
chr 10 20 20 a
chr 30 40 15 b

答え4

このスニペット:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data file $FILE:"
head $FILE

pl " Expected output:"
cat $E

pl " Results:"
datamash -t" " --group=5 max 4 --full <$FILE |
cut -d" " -f1-5

生産する:

-----
 Input data file data1:
chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

-----
 Expected output:
chr 10 20 20 a       
chr 30 40 15 b

-----
 Results:
chr 10 20 20 a
chr 30 40 15 b

これらのシステムの場合:

OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.9 (jessie) 
bash GNU bash 4.3.30
datamash (GNU datamash) 1.2
cut (GNU coreutils) 8.23

datamashのいくつかの詳細:

datamash        command-line calculations (man)
Path    : /usr/local/bin/datamash
Version : 1.2
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Help    : probably available with -h,--help
Home    : https://savannah.gnu.org/projects/datamash/ (pm)
Home    : http://www.gnu.org/software/datamash (doc)

関連情報