如何删除特定列并排序

如何删除特定列并排序

我有一个这样的数据

JW_ID   ECK number  B number    T Number    M K12   Conc(%) Yield(uM)   Yield(ug/ml)
JW0002  ECK0003       b0003        thrB       thrB    32        2.3         78
JW0003  ECK0004       b0004        thrC       thrC    18        1.7         78
JW0004  ECK0005       b0005        yaaX       yaaX    78        1.2         14
JW0005  ECK0006       b0006        yaaA        yaaA   7         2.4         71
JW0007  ECK0008       b0008        talB        talB   85        2.7         94

我正在尝试删除两列和 B Number 和 M K12,然后根据 Conc(%) Yield(uM) Yield(ug/ml) 对文件进行升序排序

我运行它作为

bash myprogram.sh filename.txt

我尝试过举办一场狂欢但没有成功,我将不胜感激任何帮助

#!/bin/bash
filename=$1
while read -r line; do
# reading each line
awk '{$3=$5=""; print $0}' filename
sort -k6,1 -k7,2 -k8,3 filename
echo $line
done < $filename

预期的输出是这样的

JW_ID   ECK number  T Number    Conc(%) Yield(uM)   Yield(ug/ml)
JW0005  ECK0006.        yaaA        7        2.4    71
JW0003  ECK0004.        thrC        18       1.7    78
JW0002  ECK0003         thrB        32       2.3    78
JW0004  ECK0005.        yaaX        78       1.2    14
JW0007  ECK0008         talB        85       2.7    94

答案1

awk应该给出期望的结果:

$ awk -F '\t' 'BEGIN{OFS="\t"} { print $1,$2,$4,$6,$7,$8 }' data | sort -nk 4,6
JW_ID   ECK number      T Number        Conc(%) Yield(uM)       Yield(ug/ml)
JW0005  ECK0006 yaaA    7       2.4     71
JW0003  ECK0004 thrC    18      1.7     78
JW0002  ECK0003 thrB    32      2.3     78
JW0004  ECK0005 yaaX    78      1.2     14
JW0007  ECK0008 talB    85      2.7     94     

如果您的字段数要高得多,这里有一个带有范围函数的版本:

用法:rng([begin],[end])

$ awk -F '\t' '
function rng(b,e,  i,d){ d=$b;
  for(i=b+1;i<e;i++){ d=d""OFS""$i }
  d=d""OFS""$e;
  return d
}
BEGIN{OFS="\t"}
{ print rng(1,2),$4,rng(6,8) }' data | sort -nk 4,6

相关内容