2017-04-10 83 views
-1

看看下面的代碼。我的意圖是僅在字母行中設置變量p爲什麼用數字行修改p?

awk '/^[A-Z]/{p="$0"; print "set p: " $p} 
{print "p: " $p}' <<EOF 
A 
1 
2 
3 
B 
4 
5 
6 
EOF 

該程序生成在我的系統下面的輸出:

set p: A 
p: A 
p: 1 
p: 2 
p: 3 
set p: B 
p: B 
p: 4 
p: 5 
p: 6 

雖然p設置僅在字母行,在每行中的值的變化。爲什麼?

+1

投票關閉作爲一個簡單的拼寫錯誤。 – tripleee

+0

你在混合使用shell和awk語法。 Awk不是shell,它是一個完全獨立的工具,具有它自己的語言。閱讀Arnold Robbins編寫的「有效的Awk編程」第4版。 –

回答

3

$p表示其編號包含在變量p中的字段。所以如果p是4,$p指的是第四個字段。我懷疑你正在將Awk語法與Perl或shell語法混合在一起。

(在我的MacOS,我得到awk: illegal field $($0), name "p"爲你的榜樣,但是這顯然取決於執行。)

公告同時在此試圖修復沒有引號周圍$0

sierra$ awk '/^[A-Z]/{p=$0; print "set p: " p} 
{print "p: " p}' <<<$'A\n1\n2\n3\nB\n4\n5\n6' 
set p: A 
p: A 
p: A 
p: A 
p: A 
set p: B 
p: B 
p: B 
p: B 
p: B 
0

@嘗試:

awk '$0 ~ /[[:alpha:]]/ && val2{print "set p: " val1 ORS val2;val2="";} $0 ~ /[[:alpha:]]/{val1=$0;next} {val2=val2?val2 ORS $0:$0} END{print "set p: " val1 ORS val2}' Input_file 

所以這裏檢查,如果線路是字母和變量值2出現,然後打印VAL1的價值觀和val2(val1將具有alphabates值,val2將具有除字母以外的所有其他值)。現在檢查一行中是否有字母,然後將val1設置爲當前行,然後使用next跳過所有下一條語句。然後如果這個條件不滿足,那麼創建名爲val2的變量,它的值將連接到它自己,在end section block中打印val1和val2的值。

編輯:現在也添加一個非線性形式的解決方案。

awk '$0 ~ /[[:alpha:]]/ && val2{ 
           print "set p: " val1 ORS val2; 
           val2=""; 
           } 
    $0 ~ /[[:alpha:]]/{ 
         val1=$0; 
         next 
         } 
         { 
         val2=val2?val2 ORS $0:$0 
         } 
    END{ 
       print "set p: " val1 ORS val2 
     } 
    ' Input_file 
+2

這似乎相當複雜,如果我將它與兩個美元符號的去除進行比較。 ;-) – ceving

+0

實際上我不明白爲什麼OP要在他/她的編碼中使用$ p的值,所以我從輸出中理解的是OP想要以字母開始的行的值,然後將所有值打印到下一個。所以我寫了這些條件。 – RavinderSingh13

0

試試這個 -

$ cat f 
A 
1 
2 
3 
B 
4 
5 
6 
$ awk '{for(i=1;i<=NF;i++) if($i ~ /[[:alpha:]]/) {k=$i;print "set p: "k} {print "p: " k}}' f 
set p: A 
p: A 
p: A 
p: A 
p: A 
set p: B 
p: B 
p: B 
p: B 
p: B 
相關問題