如何打印每个ID的最后一行?

时间:2017-09-07 14:37:22

标签: linux awk

我有一个ID列表(外显子),每个ID都有多个后缀,我想得到每个ID的最后一行

输入:

NM_203_exon_19
NM_203_exon_20
NM_0217_exon_7
NM_0217_exon_8
NM_0217_exon_9
NM_91_exon_14
NM_91_exon_15
NM_91_exon_16
NM_91_exon_17

期望的输出:

NM_203_exon_20
NM_0217_exon_9
NM_91_exon_17

5 个答案:

答案 0 :(得分:1)

tac INPUTFILE |awk -F'_' '!a[$1FS$2]++' |tac
NM_203_exon_20
NM_0217_exon_9
NM_91_exon_17

答案 1 :(得分:1)

当您扫描每一行时,您可以检查存储以前的" ID"然后在新的" ID"与众不同:

$ awk -F'_exon_' '{if($1 != id && last)print last; id=$1; last=$0} END{print last}' file
NM_203_exon_20
NM_0217_exon_9
NM_91_exon_17

答案 2 :(得分:1)

当您的列表被订购时,一个想法可以将所有内容放入数组并通过它进行迭代(不使用awk),当您更改String意味着前一个是最大的并且您将打印它,它将不会得到最后一个一,所以你将在最后打印数组的最后一项。

<div>
  <style scoped>
    h1 {color:red;}
    p {color:blue;} 
  </style>
  <h1>Heading</h1>
  <p>hello world! I'm of blue color!</p>
</div>
<p>I'm out of the scope, so I'm of the black color :(</p>

答案 3 :(得分:1)

由于文件已根据每个id的后缀进行排序,因此请为每个id打印最后一行

awk -F"_" 'NR==1{prev=$2}; $2==prev{a=$0} $2!=prev{print a; prev=$2} END{print $0}' file

输出:

NM_203_exon_20
NM_0217_exon_9
NM_91_exon_17

答案 4 :(得分:1)

使用$ tac file | sort -t_ -k2,2 -su NM_0217_exon_9 NM_203_exon_20 NM_91_exon_17 的GNU排序(稳定排序):

import pandas as pd
data = pd.read_clipboard()
data.reset_index(inplace=True)

data['combined_date'] =pd.to_datetime(data.level_1+' '+data.date)
data['prev_dt'] = data.combined_date - pd.to_timedelta(2,'m')
new_data = data.merge(data,left_on='prev_dt', right_on='combined_date')[['combined_date_x', 'comm'bined_date_y', 'ask0_x', 'ask0_y']]
new_data['deriv'] = (new_data.ask0_x - new_data.ask0_y)/2