我有一个文件test.txt
,其中包含:
1 1:? 1:0 0.762
2 1:? 2:1 0.754
3 1:? 2:1 0.848
4 1:? 1:0 1
5 1:? 2:1 0.851
在第三列中,我尝试在之后检索数字:并且根据其值,我必须对最后一列应用不同的计算。如果它是0,那么我必须通过减去1来返回第4列中的值。如果它是1,那么我必须返回第4列的值。
我可以使用以下命令检索后面的数字:
awk '{print $3}' test.txt | cut -d: -f 2
但我不知道如何继续。我怎么能这样做?
答案 0 :(得分:2)
awk 'split($3,a,":"){print a[2]?$4:$4-1}' file
或者如果您还想要其他字段
awk 'split($3,a,":"){$4=a[2]?$4:$4-1}1' file
甚至
awk 'split($3,a,":")&&!a[2]{$4--}1' file
ANOTHER
只需$ 4
awk '{$0=$4-($3~/:0$/)}1' file
行
awk '{$4-=($3~/:0$/)}1' file
答案 1 :(得分:1)
你可以用:
awk '$3 ~ /:0$/{print $4-1;next}{print $4}' test.txt
-0.238
0.754
0.848
0
0.851
如果第3列以:0
($3 ~ /:0$/
)结尾,则打印第4列减去1;否则打印第4列。
答案 2 :(得分:1)
awk '{split($3,a,":"); if(!a[2]){$4=$4-1}}1' OFS=" " file (with split)
示例:
sdlcb@Goofy-Gen:~/AMD/SO$ cat file
1 1:? 1:0 0.762
2 1:? 2:1 0.754
3 1:? 2:1 0.848
4 1:? 1:0 1
5 1:? 2:1 0.851
sdlcb@Goofy-Gen:~/AMD/SO$ awk '{split($3,a,":"); if(!a[2]){$4=$4-1}}1' OFS=" " file
1 1:? 1:0 -0.238
2 1:? 2:1 0.754
3 1:? 2:1 0.848
4 1:? 1:0 0
5 1:? 2:1 0.851
答案 3 :(得分:1)
通过拆分,
$ awk '{split($3,a,":");if(a[2]==0){$4=$4-1}}1' file | column -t
1 1:? 1:0 -0.238
2 1:? 2:1 0.754
3 1:? 2:1 0.848
4 1:? 1:0 0
5 1:? 2:1 0.851
仅打印第4列,
$ awk '{split($3,a,":");if(a[2]==0){$4=$4-1};print $4}' file
-0.238
0.754
0.848
0
0.851
答案 4 :(得分:1)
试试这个,它只使用awk:
awk '{ if (substr($3,3)==0)
print ($4-1)
else print $4
}' test.txt
答案 5 :(得分:1)
以下是其他一些变体:
awk '{$0=$4-(substr($3,3)==0?1:0)}1' file
-0.238
0.754
0.848
0
0.851
答案 6 :(得分:1)
另一个答案。
#!/usr/bin/awk -f
{
split($3, a, ":");
if (a[2] == 0) {
OFS=" ";
$4 = $4-1;
}
print($0);
}
并且如果你需要一个oneliner
$ awk '{ split($3, a, ":"); if (a[2] == 0) { OFS=" "; $4 = $4-1; } print($0); }' file.txt
输出:
1 1:? 1:0 -0.238
2 1:? 2:1 0.754
3 1:? 2:1 0.848
4 1:? 1:0 0
5 1:? 2:1 0.851