2016-08-03 105 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()。

讀這本書...

相關問題