awk与cut和if的组合

时间:2014-11-24 09:18:00

标签: unix if-statement awk cut

我有一个文件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

但我不知道如何继续。我怎么能这样做?

7 个答案:

答案 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