如果其他列满足特定条件,则使用awk gensub

时间:2016-08-03 22:04:59

标签: awk command-line

我想每次更换"结束"在第4栏中显示" p11"如果第5列包含" p",则将其替换为" q11"如果第5列包含" q"

我想每次更换"结束"在第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

但我希望结果让列中的第4列中的p11代替了p12而且我也希望同样的awk命令能够对第5列做同样的事情

如果有任何混淆,请告诉我

1 个答案:

答案 0 :(得分:4)

做你想做的事的简单方法:

$ 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为第3个arg匹配(),其他awks使用match()/ substr()。

阅读本书......