使用if else时awk for循环错误

时间:2015-05-29 13:33:20

标签: awk

这是数据文件t2,由选项卡

分隔
_Ibaseebna1_1 0.79(0.28-2.22) 0.6540
_Ibaseebna1_2 0.88(0.48-1.62) 0.6900
_Ibaseebna1_3 0.78(0.32-1.86) 0.5700
ptrend 0.93(0.72-1.20) 0.5800
_Ibaseebna1_1 1.85(0.60-5.73) 0.2850
_Ibaseebna1_2 1.89(0.57-6.27) 0.2950
_Ibaseebna1_3 3.21(1.00-10.33) 0.0510
ptrend 1.39(1.05-1.85) 0.0200
pinteraction 1.39(0.93-2.10) 0.1120

如果$ 1 == ptrend或== pinteraction,我想删除第二列的值。

结果应该是:

_Ibaseebna1_1 0.79(0.28-2.22) 0.6540
_Ibaseebna1_2 0.88(0.48-1.62) 0.6900
_Ibaseebna1_3 0.78(0.32-1.86) 0.5700
ptrend     0.5800
_Ibaseebna1_1 1.85(0.60-5.73) 0.2850
_Ibaseebna1_2 1.89(0.57-6.27) 0.2950
_Ibaseebna1_3 3.21(1.00-10.33) 0.0510
ptrend     0.0200
pinteraction     0.1120 

我可以使用代码:

awk -F' ' ' {
               if ( $1=="ptrend" ) print $1," "," ",$3;
               else
               if ( $1=="pinteraction" ) print $1," "," ",$3;
               else
               print $0; }' t2.txt > t3.txt

但是当我尝试使用for循环时:

for i in ptrend pinteraction
do

awk -F' ' -v p=$i '{
                if ( $1==p ) print $1," "," ",$3;
                else
                print $0; }' t2.txt > t3.txt
done

给出的结果如下:

_Ibaseebna1_1 0.79(0.28-2.22) 0.6540
_Ibaseebna1_2 0.88(0.48-1.62) 0.6900
_Ibaseebna1_3 0.78(0.32-1.86) 0.5700
ptrend 0.93(0.72-1.20) 0.5800
_Ibaseebna1_1 1.85(0.60-5.73) 0.2850
_Ibaseebna1_2 1.89(0.57-6.27) 0.2950
_Ibaseebna1_3 3.21(1.00-10.33) 0.0510
ptrend 1.39(1.05-1.85) 0.0200
pinteraction     0.1120

循环有什么问题吗?

2 个答案:

答案 0 :(得分:2)

每次通过shell循环操作原始文件。所以你的输出是awk的最后一次运行而不是运行的组合。

如果你想使用这种方法(我不认为你这样做),你需要在每个循环中使用一个临时文件,然后在每个循环结束时将其移动到原始文件名。循环(或类似)。

但原始的awk脚本比循环更好。

虽然我认为更好但是会是这样的:

awk -F $'\t' '
    BEGIN {
        map["ptrend"]=1
        map["pinteraction"]=1
    }

    map[$2] {$2=""}
    {print}
' t2.txt > t3.txt

答案 1 :(得分:2)

循环的根本问题在于它是一个循环。编写shell循环只是为了操作文本总是错误的方法。你可以在一个简短的,简单的awk命令中完成你所描述的内容,而没有周围的shell循环:

awk '!/^_/{$2=""}1' t2