4つの列を持つテキストファイルがあります。ファイルの最後まで読んで、列3(最初の5つの値)と列1に最も高い数字を印刷する必要があります。
入力.txt
xm|340034177|ref|RT_235820.1| 139697 192 0
xm|161622288|ref|RT_340093.1| 153819 2607 0
xm|75755638|ref|RT_557407.1| 153821 1937 0
xm|108773031|ref|RT_678101.1| 161452 1688 0
xm|30352011|ref|RT_784766.1| 150568 105 0
出力.txt
xm|161622288|ref|RT_340093.1| 2607
xm|75755638|ref|RT_557407.1| 1937
xm|108773031|ref|RT_678101.1| 1688
xm|340034177|ref|RT_235820.1| 192
xm|30352011|ref|RT_784766.1| 105
答え1
sort -k3n,3 filename | tail -5 | cut -d " " -f1,6-7
上記のコマンドは、3番目のフィールドのファイルをソートします。次に、この出力をtail
3番目の列の最初の5つの数字を印刷するコマンドにパイプします。ただし、出力に最初と3番目の列だけが必要な場合は、出力をcut
コマンドにパイプできます。
テスト
cat filename
T_235820.1| 139697 192 0
xm|161622288|ref|RT_340093.1| 153819 2607 0
xm|75755638|ref|RT_557407.1| 153821 1937 0
xm|108773031|ref|RT_678101.1| 161452 1688 0
xm|30352011|ref|RT_784766.1| 150568 105 0
T_235820.1| 139697 192 0
xm|161622288|ref|RT_340093.1| 153819 607 0
xm|75755638|ref|RT_557407.1| 153821 937 0
xm|108773031|ref|RT_678101.1| 161452 1881 0
xm|30352011|ref|RT_784766.1| 150568 1051 0
これで、このファイルに対して上記のコマンドを実行します。
sort -k3n,3 filename | tail -5 | cut -d " " -f1,6-7
私が得た結果は次のとおりです。
xm|30352011|ref|RT_784766.1| 1051
xm|108773031|ref|RT_678101.1| 1688
xm|108773031|ref|RT_678101.1| 1881
xm|75755638|ref|RT_557407.1| 1937
xm|161622288|ref|RT_340093.1| 2607
編集する
ファイルに浮動小数点と負の数がある場合は、-gフラグを追加することもできます。コマンドは次のとおりです。
sort -k3ng,3 filename | tail -5 | cut -d " " -f1,6-7
答え2
ファイルを処理する前にソートできますawk
。
$ sort -rnk3 file | awk 'FNR < 6 {print $1,$3}' OFS="\t"
xm|161622288|ref|RT_340093.1| 2607
xm|75755638|ref|RT_557407.1| 1937
xm|108773031|ref|RT_678101.1| 1688
xm|340034177|ref|RT_235820.1| 192
xm|30352011|ref|RT_784766.1| 105
あるいは、perl
単独でタスクを実行することもできます。
$ perl -anle '
push @a, [$F[0],$F[2]];
END {
$" = "\t";
print "@$_" for (sort { $b->[1] <=> $a->[1] } @a)[0..4];
}
' file
xm|161622288|ref|RT_340093.1| 2607
xm|75755638|ref|RT_557407.1| 1937
xm|108773031|ref|RT_678101.1| 1688
xm|340034177|ref|RT_235820.1| 192
xm|30352011|ref|RT_784766.1| 105