求教高手如何用awk编程解决这个问题?谢谢

sh/bash/dash/ksh/zsh等Shell脚本
回复
horseinfly
帖子: 9
注册时间: 2011-05-30 3:04

求教高手如何用awk编程解决这个问题?谢谢

#1

帖子 horseinfly » 2011-05-30 3:21

一个文本,内容如下:

101-GG3RHKA01B9FA8; ; Root; 100; Bacteria; 100; "Firmicutes"; 76; "Clostridia"; 66; Clostridiales; 66; Incertae Sedis XI; 30; Soehngenia; 26
101-GG3RHKA01EWUD1; -; Root; 100; Bacteria; 100; "Actinobacteria"; 98; Actinobacteria; 98; Actinobacteridae; 98; Actinomycetales; 98; Corynebacterineae; 63; Corynebacteriaceae; 61; Corynebacterium; 47
101-GG3RHKA01BUBNH; ; Root; 100; Bacteria; 100; "Firmicutes"; 80; "Clostridia"; 76; Clostridiales; 76; Incertae Sedis XI; 42; Soehngenia; 30
101-GG3RHKA01D4PV7; ; Root; 100; Bacteria; 96; "Firmicutes"; 68; "Clostridia"; 62; Clostridiales; 61; "Ruminococcaceae"; 59; Oscillibacter; 54

我要求用awk得到以下结果:
以“;”为域分隔,每个数字对应前面的文字。如果,$(NF-2)>=80, then print $(NF-3)"-"$(NF-1), else, if $(NF-4)>=80, then print $(NF-5)"_"$(NF-1), 依次类推,直到,某个文字后的数字大于80.
比如第一行,我要求得到的结果是,Bacteria_Soehngenia,
第二行, Actinomycetales_Corynebacterium.

我的代码如下:
awk -F";" '{i=2; while(i<=(NF-2))if($(NF-'$i')<80){i=i+2} else {print$(NF-'$i'-1)"_"$(NF-'$i'+1); break}}' ,

可运行后无输出,请高手指点,谢谢。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求教高手如何用awk编程解决这个问题?谢谢

#2

帖子 fnan » 2011-05-31 1:26

要求与例子不符:
{print$(NF-'$i'-1)"_"$(NF-'$i'+1); break} 是数字的前后域。
比如第一行,我要求得到的结果是,Bacteria_Soehngenia,
第二行, Actinomycetales_Corynebacterium. 是数字前域与当前行倒数第二域。
逻辑混乱是写不出好结果的。
按例子修改可以是:
awk -F";" '{i=2; while(i<=(NF-2)) {if($(NF-i)<80) {i=i+2} else {print $(NF-(i+1)) "_" $(NF-(i-1)); break}}}'
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
horseinfly
帖子: 9
注册时间: 2011-05-30 3:04

Re: 求教高手如何用awk编程解决这个问题?谢谢

#3

帖子 horseinfly » 2011-06-01 10:39

谢谢,高手,果然work了。
不过我还有几个不明白,
1.这个{}什么时候用什么时候不用,有没有一个说法。我一直迷糊。
2.在awk里用变量,不是要在变量前面加 $且要单引号的么?

谢谢



fnan 写了:要求与例子不符:
{print$(NF-'$i'-1)"_"$(NF-'$i'+1); break} 是数字的前后域。
比如第一行,我要求得到的结果是,Bacteria_Soehngenia,
第二行, Actinomycetales_Corynebacterium. 是数字前域与当前行倒数第二域。
逻辑混乱是写不出好结果的。
按例子修改可以是:
awk -F";" '{i=2; while(i<=(NF-2)) {if($(NF-i)<80) {i=i+2} else {print $(NF-(i+1)) "_" $(NF-(i-1)); break}}}'
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 求教高手如何用awk编程解决这个问题?谢谢

#4

帖子 fnan » 2011-06-04 3:51

{} 是组合指令用的,一个指令不需要,有时为了提高可读性而使用。
awk自身的变量不需$和单引号。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复