2016-08-03 103 views
0

如果第5列中包含“p”,并且第5列中包含“p11”,并且第5列中包含“p11”,并且将其替换为“q11” q”如果其他列满足某些条件,则使用awk gensub

我要替换每次‘结束’显示,在5列有‘P11’如果第4列中包含‘p’,而代之以‘Q11’如果第4列中包含‘q’

有了这个输入

Bill 89 22 9end q12 2683 2687 
Sue  21 20 4end p13 9390 9302 
Sam  89 9 p12 p11 9029 9032 
Lee  39 20 q12 6end 3892 9032 
Smitty 93 7 p13 5end 3902 3902 

我想

Bill 89 22 q11 q12 2683 2687 
Sue  21 20 p11 p13 9390 9302 
Sam  89 9 p12 p11 9029 9032 
Lee  39 20 q12 q11 3892 9032 
Smitty 93 7 p13 p11 3902 3902 

作为输出

..

我基本上要这样的命令,但有正确的语法和打印不匹配的行未调整

awk BEGIN {OFS="\t"} ($5 ~ /q/ {$4=gensub(/[0-9]end/,"q11",1,$4); print}) || ($5 ~ /p/ {$4=gensub(/[0-9]end/,"p11",1,$4); print}) || ($4 ~ /q/ {$5=gensub(/[0-9]end/,"q11",1,$4); print}) || ($4 ~ /q/ {$5=gensub(/[0-9]end/,"q11",1,$4); print})' input 

..

我知道这个输入

Steve 89  22  2end q12  2683 2687 

我可以运行此

awk 'BEGIN {OFS="\t"} {$4=gensub(/[0-9]end/,"q11",1,$4); print}' input 

而得到这个作为输出

Steve 89781 22 q11 q12 26839389 26879820 

但我想要的结果列中有p11四列有P12,而不是和我也想同样的awk命令,以便能够做同样的事情与列5

请让我知道,如果有任何混淆

+0

@EdMorton然后你可以忽略我的问题。我不知道如何使用或与gensub,我的其他问题都没有帮助,但我正在通过它的教科书 – Jacob

+0

@EdMorton问题是,我想要每一行打印,但只想确定符合条件的行会对其执行替换。如果我运行'awk'BEGIN {OFS =“\ t”} $ 5〜/ q/{$ 4 = gensub(/ [0-9] end /,“q11”,1,$ 4);打印}输入',则只打印一行。我希望每行打印一行,并根据列 – Jacob

+1

的不同列出不同的替代项,因此第1步是将'print'移动到只在条件成立时才执行的块的外部,即更改'/ foo/{bar; print}'到'/ foo/{bar} {print}'。看,我知道当你只想完成一项工作时,很难花时间阅读教程或书籍(请相信我 - 现在我正在学习Ruby On Rails,开始为期5天的课程,然后再尝试完成我的第一项任务使用它),但如果你不这样做,你只是浪费你自己的时间,想知道如何做最简单的事情,并在以后清理大量的错误。 –

回答

3

最简单的方法做你想:上述

$ cat tst.awk 
BEGIN { OFS="\t" } 
($4 ~ /end/) && match($5,/[pq]/,a) { $4 = a[0] "11" } 
($5 ~ /end/) && match($4,/[pq]/,a) { $5 = a[0] "11" } 
{ $1=$1; print } 

$ awk -f tst.awk file 
Bill 89  22  q11  q12  2683 2687 
Sue  21  20  p11  p13  9390 9302 
Sam  89  9  p12  p11  9029 9032 
Lee  39  20  q12  q11  3892 9032 
Smitty 93  7  p13  p11  3902 3902 

采用GNU AWK的第三ARG匹配(),与其他awks使用匹配()/ SUBSTR()。

读这本书...

相关问题