解決できないような問題があります。
次のようなタブで区切られた巨大なテキストファイルがあります。
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)