我想每次更换"结束"在第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列做同样的事情
如果有任何混淆,请告诉我
答案 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()。
阅读本书......