这是数据文件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
循环有什么问题吗?
答案 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