gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:14:24 26 4
gpt4 key购买 nike

继我之前在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com