arrays - 使用 awk 在 bash 中使用另一个有序数组模式对多行数组进行排序

标签 arrays awk

继我之前在 my old post 上的帖子之后因为它没有完全回答我的问题。我想知道如何对包含来自数组 b 的多行特定标记代码的数组 a 进行排序。

我有一个数组a,下面几行

rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214 stuff
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660 stuff
rs6605071   chr1:962943 C   84069   NM_001160184.1  stuff
rs6605071   chr1:962943 C   339451  NC_006462594.2  stuff
rs6605071   chr1:962943 C   ENSG00000135234 ENST00000624144 stuff
rs6605071   chr1:962943 C   339451  XR_001737138.1  stuff
rs6605071   chr1:962943 C   334324  NC_006462632.2  stuff
rs6605071   chr1:962943 C   84333   NM_004353462.1  stuff
rs6605071   chr1:962943 C   339451  XM_006710600.3  stuff

还有另一个有序数组 b,它包含以下几行:

NC
NG
NM
NP
NR
XM
XP
XR
WP

我想对数组 a 中的行进行排序以匹配第 5 列上的数组 b 的顺序以获得所需的输出:

rs6605071   chr1:962943 C   334324  NC_006462632.2  stuff
rs6605071   chr1:962943 C   339451  NC_006462594.2  stuff
rs6605071   chr1:962943 C   84069   NM_001160184.1  stuff
rs6605071   chr1:962943 C   84333   NM_004353462.1  stuff
rs6605071   chr1:962943 C   339451  XM_006710600.3  stuff
rs6605071   chr1:962943 C   339451  XR_001737138.1  stuff
rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214 stuff
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660 stuff
rs6605071   chr1:962943 C   ENSG00000135234 ENST00000624144 stuff

我在之前的帖子中提出了以下命令:

awk -v OFS='\t' '
FNR==NR{
  split($5,a,"_")
  array[a[1]]=$0
  next
}
($1 in array) {
  print array[$0]
  b[$1]
}
END{
  for(i in b){
    delete array[i]
  }
  for(j in array){
    print array[j]
  }
}' <(printf '%s\n' "${a[@]}") <(printf '%s\n' "${b[@]}")

但它打印:

rs6605071   chr1:962943 C   334324  NC_006462632.2  stuff
rs6605071   chr1:962943 C   84069   NM_001160184.1  stuff
rs6605071   chr1:962943 C   339451  XM_006710600.3  stuff
rs6605071   chr1:962943 C   339451  XR_001737138.1  stuff
rs6605071   chr1:962943 C   ENSG00000188976 ENST00000487214 stuff
rs6605071   chr1:962943 C   ENSG00000187961 ENST00000622660 stuff
rs6605071   chr1:962943 C   ENSG00000135234 ENST00000624144 stuff

如您所见,缺少包含 NMNC 的行。您能告诉我如何更新此命令以输出所需的结果吗?

提前致谢。

最佳答案

能否请您尝试以下。我现在稍微改变了解决方案。为什么因为不清楚您是否要从数组 a 中打印例如 NC 的所有值,所以我现在更改了逻辑。它会为字符串 NCNV 将值连接到自身,当它在数组 b 左右检查它时,它将打印它的所有值(来自数组 a ).

awk -v OFS='\t' '
FNR==NR{
  split($5,a,"_")
  array[a[1]]=(array[a[1]]?array[a[1]] ORS $0:$0)
  next
}
($1 in array) {
  print array[$0]
  delete array[$0]
}
END{
  for(j in array){
   if(array[j]){ print array[j] }
  }
}' <(printf '%s\n' "${a[@]}") <(printf '%s\n' "${b[@]}")

关于arrays - 使用 awk 在 bash 中使用另一个有序数组模式对多行数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54623483/

相关文章:

Javascript - 将数据从谷歌趋势网址保存到 PHP 数组中

awk - 根据第一列组合多个制表符分隔文件的某些列

linux - awk 命令查找和替换值

linux - Unix 'alias'使用 'awk'命令失败

c# 数组的子字符串等价物

javascript - 如何从 ajax 调用中过滤 null 或未定义的值?

linux - 将 awk 输出重定向到 bash 中的文件

linux - RHEL 版本 5.5 (Tikanga),df --total 选项

javascript - ES6 中的 Array.reduce(),隐式返回和语法糖。到底发生了什么?

java - 使用泛型转换数组