Luc*_*ues 7 text-processing sort
我有以下类型的文件:
transcr_25793 +
YAL039C -
transcr_25793 +
YAL037C-B -
transcr_20649 +
YBL100C -
transcr_7135 +
YBL029C-A -
transcr_11317 +
YBL067C -
transcr_25793 +
YAL038W +
transcr_7135 +
YBL029W +
Run Code Online (Sandbox Code Playgroud)
我试图得到这样的东西:
transcr_7135 +
YBL029C-A -
transcr_7135 +
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL039C -
transcr_25793 +
YAL037C-B -
transcr_25793 +
YAL038W +
Run Code Online (Sandbox Code Playgroud)
然后,之后,我一直在寻找这样的东西:
transcr_7135 +
YBL029C-A -
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL039C -
YAL037C-B -
YAL038W +
Run Code Online (Sandbox Code Playgroud)
我已经滚动浏览了sort
手册和一些帖子,但找不到任何适合于此的内容,只是sort
使用数值来获取奇数行...
纯gawk
溶液:
awk -F_ 'NR%2{i=$2;next}{a[i]=a[i]"\n"$0}
END{PROCINFO["sorted_in"]="@ind_num_asc";
for(i in a) printf "%s","transcr_"i""a[i]"\n"}' file
Run Code Online (Sandbox Code Playgroud)
诀窍是在's PROCINFO 特殊数组的a
帮助下以数字方式对数组的索引进行排序gawk
。
transcr_7135
YBL029C-A -
YBL029W +
transcr_11317
YBL067C -
transcr_20649
YBL100C -
transcr_25793
YAL039C -
YAL037C-B -
YAL038W +
Run Code Online (Sandbox Code Playgroud)
顺便说一句,遗憾的是 awk 没有提供自然排序的选项,即版本排序(根据带数字的文本)。
不完全是您所显示的排序顺序,但也许也是对的?
$ cat input.txt|paste - -| sort -k1,1V -k2,2| tr "\t" "\n" | awk '{if($0 in line == 0) {line[$0]; print}}'
transcr_7135 +
YBL029C-A -
YBL029W +
transcr_11317 +
YBL067C -
transcr_20649 +
YBL100C -
transcr_25793 +
YAL037C-B -
YAL038W +
YAL039C -
Run Code Online (Sandbox Code Playgroud)
编辑:
插入行号并将其用作排序键,应该会产生您喜欢的确切输出:
$ cat input.txt | paste - - | nl | sort -k2,2V -k1,1g | cut -f2- | tr "\t" "\n" | awk '{if($0 in line == 0) {line[$0]; print}}'
Run Code Online (Sandbox Code Playgroud)