亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: awk的next使用 [打印本頁(yè)]

作者: ghostgorst    時(shí)間: 2009-08-21 11:11
標(biāo)題: awk的next使用
man awk next只能讀懂字面上含義,

誰(shuí)能給幾個(gè)例子說(shuō)明下具體含義和使用方法呢?自己寫的幾個(gè)例子都達(dá)不到預(yù)期效果,可能是理解的不對(duì).

telfort1:/kfbuild/x144378>cat file
a
a
b
c
d
e
f

telfort1:/kfbuild/x144378>awk '/^a/{print $0} /^a/{print $0}' file
a
a
a
a

telfort1:/kfbuild/x144378>awk '/^a/{print $0;next} /^a/{print $0}' file
a
a
#1.按我的理解也應(yīng)該輸出4個(gè)a,誰(shuí)能幫忙解釋解釋呢?我是理解成讀入下一行匹配的模式

這2個(gè)輸出結(jié)果一樣啊
awk '/^a/{print $0;next}' file file
awk '/^a/{print $0}' file file
這2個(gè)輸出結(jié)果也一樣啊
awk '/^a/{print $0;next}' file
awk '/^a/{print $0}' file
#2.next有什么作用呢?


awk '/^a/{next;print $0}' file這個(gè)什么也輸出不來(lái)
#3.awk的模式和動(dòng)作具體怎么運(yùn)行的呢?模式先匹配所有行,動(dòng)作再一個(gè)個(gè)執(zhí)行么?還是匹配一行,動(dòng)作處理一行呢

問(wèn)的應(yīng)該比較白癡,大家給點(diǎn)撥下啊.

[ 本帖最后由 ghostgorst 于 2009-8-21 11:12 編輯 ]
作者: kwokcn    時(shí)間: 2009-08-21 11:11
這樣理解awk的next:
遇到next時(shí),讀入下一行,然后從頭開(kāi)始處理,即next起到了{(lán)getline; goto head}的作用。

awk '/^a/{print $0;next} /^a/{print $0}' 用偽碼可以這樣來(lái)看:

  1. :head
  2. if 匹配/^a/
  3.     print $0
  4.     讀入下一行
  5.     goto head
  6. fi
  7. if 匹配/^a/
  8.     print $0
  9. fi
  10. goto head
復(fù)制代碼

作者: ly5066113    時(shí)間: 2009-08-21 11:17
標(biāo)題: 回復(fù) #1 ghostgorst 的帖子
next  可以簡(jiǎn)單理解為跳過(guò)后面的代碼,如果next被執(zhí)行,那么它后面的代碼就都不會(huì)被執(zhí)行了。
作者: ghostgorst    時(shí)間: 2009-08-21 11:19
標(biāo)題: 回復(fù) #2 ly5066113 的帖子
這個(gè)應(yīng)該是一種功能吧,感覺(jué)用來(lái)理解
awk '/^a/{next;print $0}' file這個(gè)挺合適
作者: blackold    時(shí)間: 2009-08-21 11:19
標(biāo)題: 回復(fù) #1 ghostgorst 的帖子
awk code: 'BEGIN{...}{Main Input}END{..}'
next 讀入下一輸入行并從(Main Input中的)第一個(gè)規(guī)則開(kāi)始執(zhí)行腳本。
有這么難理解嗎?
作者: blackold    時(shí)間: 2009-08-21 11:20
標(biāo)題: 回復(fù) #3 ghostgorst 的帖子
awk '/^a/{next;print $0}
既然next了,print $0不是多余的嗎?
作者: ghostgorst    時(shí)間: 2009-08-21 11:26
標(biāo)題: 回復(fù) #5 blackold 的帖子
不知道next功能,才這么寫了,初學(xué)實(shí)驗(yàn)而已.

awk code: 'BEGIN{...}{Main Input}END{..}'
next 讀入下一輸入行并從(Main Input中的)第一個(gè)規(guī)則開(kāi)始執(zhí)行腳本。

不過(guò)有這一句解釋就好理解多了.

[ 本帖最后由 ghostgorst 于 2009-8-21 11:27 編輯 ]
作者: blackold    時(shí)間: 2009-08-21 11:29
標(biāo)題: 回復(fù) #6 ghostgorst 的帖子
手冊(cè)里面不是有這句話嗎?

一般稱為next 語(yǔ)句、命令,或者是函數(shù),很少見(jiàn)人把它稱為next功能。
作者: ghostgorst    時(shí)間: 2009-08-21 11:33
標(biāo)題: 回復(fù) #7 blackold 的帖子
不知道next語(yǔ)句的功能
作者: blackold    時(shí)間: 2009-08-21 11:42
理解這點(diǎn)有這么難嗎?我想不通。

生活經(jīng)常碰到這類事情,比如,你正在排隊(duì)辦理入學(xué)手續(xù),人家看你還沒(méi)交費(fèi),就next,下一個(gè)過(guò)來(lái)辦,你先到財(cái)務(wù)交費(fèi)之后再過(guò)來(lái)……
作者: wwmstone    時(shí)間: 2009-08-21 11:46
man里的解釋:
       next                  Stop processing the current input record.  The next input record is read and processing starts over
                             with the first pattern in the AWK program.  If the end of  the  input  data  is  reached,  the  END
                             block(s), if any, are executed.

意思就是:停止處理當(dāng)前輸入記錄,下一個(gè)記錄讀入然后從第一個(gè)模式匹配。


也就是想當(dāng)于 C 中的 continue的意思一樣。

[ 本帖最后由 wwmstone 于 2009-8-21 11:48 編輯 ]
作者: 小木蟲子    時(shí)間: 2009-08-21 11:47
awk '{if ($0 ~ /a/)next;else print}' test
b
c
d
e
f
作者: dolinux    時(shí)間: 2009-08-21 11:48
標(biāo)題: 回復(fù) #9 blackold 的帖子
呵呵,黑哥這個(gè)說(shuō)法很形象啊!
作者: ghostgorst    時(shí)間: 2009-08-21 11:48
標(biāo)題: 回復(fù) #9 blackold 的帖子
我理解成直接把交了學(xué)費(fèi)的人拉過(guò)來(lái)辦理入學(xué)手續(xù)了
作者: ghostgorst    時(shí)間: 2009-08-21 11:50
標(biāo)題: 回復(fù) #10 wwmstone 的帖子
看來(lái)我的手冊(cè)比較土

awk(1)                                                               awk(1)

           if(expression) statement [ else statement ]
           while(expression) statement
           for(expression;expression;expression) statement
           for(var in array) statement
           do statement while(expression)
           break
           continue
           {[statement  ...]}
           expression          # commonly  var = expression
           print [expression-list] [ > expression]
           printf format [, expression-list] [ > expression]
           return [expression]
          next                # skip remaining patterns on this input line.           delete array [expression]   # delete an array element.
           exit [expression]   # exit immediately; status is expression.



只有這一行解釋啊
作者: blackold    時(shí)間: 2009-08-21 11:50
標(biāo)題: 回復(fù) #13 ghostgorst 的帖子
沒(méi)有錯(cuò)啊,排在你后面的下一個(gè)同學(xué)過(guò)來(lái)辦理手續(xù)(手續(xù)從頭開(kāi)始辦理,不是接著你的辦理步驟)。
作者: wwmstone    時(shí)間: 2009-08-21 11:52
黑哥說(shuō)得形象,就是這個(gè)理解的。。
作者: ghostgorst    時(shí)間: 2009-08-21 11:57
標(biāo)題: 回復(fù) #15 blackold 的帖子
我后面的也沒(méi)交費(fèi),后面的后面那個(gè)交費(fèi)了,

我原來(lái)理解成直接取后面的后面那個(gè)人了,

本來(lái)我是想處理當(dāng)前模式的時(shí)候,當(dāng)然只讀滿足當(dāng)前模式的數(shù)據(jù)了.
作者: 小木蟲子    時(shí)間: 2009-08-21 12:32
[root@test ~]# more test
1  a
2  b
3  c
4  d
5  e
6  f
7  g
8  h
9  i
10 j
[root@test ~]# awk '{if ($1 >= 5) next;print $2}' test
a
b
c
d
[root@test ~]#


next停止對(duì)當(dāng)前輸入記錄的處理,從下一個(gè)輸入記錄繼續(xù)。

[ 本帖最后由 小木蟲子 于 2009-8-21 14:54 編輯 ]
作者: ghostgorst    時(shí)間: 2009-08-21 14:09
標(biāo)題: 回復(fù) #19 kwokcn 的帖子
awk '/^a/{print $0} /^a/{print $0}' 那這樣不加next語(yǔ)句,awk怎么處理呢?
1.讀入一行,從第一個(gè)模式開(kāi)始匹配一直到最后一個(gè)模式,所有模式都匹配一邊么?
2.還是處理一個(gè)模式時(shí)候,把所有匹配行都讀入處理,然后再處理下一個(gè)模式?

按照大家回帖我理解多數(shù)都是第1種情況,但想不出來(lái)例子證明這點(diǎn).
作者: wwmstone    時(shí)間: 2009-08-21 14:19
偽碼來(lái)表示完整的AWK處理流程:


for (i = 0; i <啟動(dòng)參數(shù)中 -v Assignment 數(shù)目; i++)
{
    執(zhí)行第 i 個(gè) -v Assignment,為相應(yīng)的變量賦值
}

for (i = 0; i < BEGIN模式的數(shù)目; i++)
{
    處理第i個(gè)BEGIN模式對(duì)應(yīng)的操作
}

for (i = 0; i < 啟動(dòng)參數(shù)中 File Assignment 參數(shù)的總個(gè)數(shù); i++)
{

if (
i 個(gè)參數(shù)是 Assignment)


{

        執(zhí)行對(duì)應(yīng)的Assignment,為相應(yīng)的變量賦值

continue;


}


    打開(kāi)第i個(gè)參數(shù)對(duì)應(yīng)的待處理文件

while ( not
文件結(jié)束)


{



根據(jù)RS,從待處理文件中讀取一條記錄



根據(jù)FS,將讀取的記錄分隔成不同的字段


for (j = 0; j < pattern
的數(shù)目; j++)


{


if (
j個(gè)pattern匹配成功) //如果沒(méi)有指定pattern,則總是匹配成功


{

                執(zhí)行對(duì)應(yīng)的action
//
如果沒(méi)有指定action,缺省為 print $0


}


}
//
所有pattern匹配結(jié)束


}
//
一個(gè)文件處理結(jié)束

}
//
所有文件都處理結(jié)束


for (i = 0; i < END模式的數(shù)目; i++)
{
    處理第i個(gè)END模式對(duì)應(yīng)的操作
}
作者: ly5066113    時(shí)間: 2009-08-21 14:20
標(biāo)題: 回復(fù) #20 ghostgorst 的帖子
man awk

AWK PROGRAM EXECUTION
       An  AWK program consists of a sequence of pattern-action statements and
       optional function definitions.
              pattern   { action statements }
              function name(parameter list) { statements }
       Gawk first reads the program source from the program-file(s) if  speci-
       fied, from arguments to --source, or from the first non-option argument
       on the command line.  The -f and --source options may be used  multiple
       times  on  the command line.  Gawk reads the program text as if all the
       program-files and command  line  source  texts  had  been  concatenated
       together.   This  is  useful  for  building libraries of AWK functions,
       without having to include them in each new AWK program that uses  them.
       It also provides the ability to mix library functions with command line
       programs.
       The environment variable AWKPATH specifies a search path  to  use  when
       finding  source  files named with the -f option.  If this variable does
       not exist, the default path is ".:/usr/local/share/awk".   (The  actual
       directory  may  vary, depending upon how gawk was built and installed.)
       If a file name given to the -f option contains a "/" character, no path
       search is performed.
       Gawk executes AWK programs in the following order.  First, all variable
       assignments specified via the -v option are performed.  Next, gawk com-
       piles  the program into an internal form.  Then, gawk executes the code
       in the BEGIN block(s) (if any), and then proceeds  to  read  each  file
       named  in  the  ARGV array.  If there are no files named on the command
       line, gawk reads the standard input.
       If a filename on the command line has the form var=val it is treated as
       a  variable  assignment.   The  variable var will be assigned the value
       val.  (This happens after any BEGIN block(s) have been  run.)   Command
       line  variable assignment is most useful for dynamically assigning val-
       ues to the variables AWK uses to  control  how  input  is  broken  into
       fields  and records.  It is also useful for controlling state if multi-
       ple passes are needed over a single data file.
       If the value of a particular element of ARGV is empty (""), gawk  skips
       over it.
       For  each record in the input, gawk tests to see if it matches any pat-
       tern in the AWK program.  For each pattern that the record matches, the
       associated  action  is  executed.  The patterns are tested in the order
       they occur in the program.

       Finally, after all the input is exhausted, gawk executes  the  code  in
       the END block(s) (if any).
作者: kwokcn    時(shí)間: 2009-08-21 14:34
標(biāo)題: 回復(fù) #20 ghostgorst 的帖子
是第一種,每讀一行做一遍處理。

這個(gè)貌似沒(méi)必要證明吧……如果非要確定,一個(gè)簡(jiǎn)單的方式就是在awk內(nèi)部沒(méi)有存儲(chǔ)操作的前提下,直接看一下awk占用的內(nèi)存是否線性增長(zhǎng)就行了。
作者: ghostgorst    時(shí)間: 2009-08-21 14:41
標(biāo)題: 回復(fù) #23 kwokcn 的帖子
感謝各位幫忙了.非常感謝
作者: ghostgorst    時(shí)間: 2009-08-21 14:43
標(biāo)題: 回復(fù) #21 wwmstone 的帖子
謝謝大你的偽代碼了.
作者: lucash    時(shí)間: 2009-08-21 14:49
先說(shuō)你的后面兩個(gè)問(wèn)題,為了方便,print $0都寫成print(因?yàn)樾Ч粯?
2,awk '/^a/{print ;next}' t
如果匹配以a開(kāi)頭則順序進(jìn)行花括號(hào)里面的操作,而匹配以a開(kāi)頭的記錄后的默認(rèn)操作是print 然后讀入下一條記錄(next),  
因此,這個(gè)花括號(hào)和里面的東西都是多余的,效果和awk '/^a/' t 一樣。 讀兩個(gè)文件也一樣的道理

3,awk '/^a/{next;print}' t
道理跟上面說(shuō)的一樣,如果匹配以a開(kāi)頭的行,則進(jìn)行{}里的操作(也就是說(shuō){}里的操作都是在匹配/^a/的前提下進(jìn)行的)
里面的print是沒(méi)有意義的。因?yàn)樵趐rint之前已經(jīng)next(讀下一記錄)了,下一條記錄不匹配以a開(kāi)頭的話就不進(jìn)行任何操作(默認(rèn))
匹配的話就next了。

你的本意應(yīng)該是想用awk '/^a/{next;print}' 來(lái)輸出不匹配以a開(kāi)頭的行,這是不正確的,因?yàn)槟銢](méi)有為不匹配以a開(kāi)頭的行
指定一個(gè)動(dòng)作。因此得到的是什么都沒(méi)有。應(yīng)該改成這樣來(lái)輸出不以a開(kāi)頭的行
awk '/^a/{next}{print}' t
或者
awk '/^a/{next}1' 1表示默認(rèn)打印操作

第一個(gè)問(wèn)題
1 ,awk '/^a/{print;next}/^a/{print}' t
在這里兩個(gè)pattern都是一樣的,awk只認(rèn)為他們是一個(gè),但是操作是連續(xù)起來(lái)的
相當(dāng)于
awk '/^a/{print;next;print}' t   
這個(gè)時(shí)候很清楚了,后面一個(gè)print沒(méi)有意義了。
awk '/^a/{print}/^a/{print}' t  <=>  awk '/^a/{print;print}' t
awk '/^a/{print}/^b/{print}/^a/{print}' t  <=> awk '/^a/{print;print}/^b/{print}' t
作者: ghostgorst    時(shí)間: 2009-08-21 15:01
標(biāo)題: 回復(fù) #26 lucash 的帖子
awk '/^a/{print}/^b/{print}/^a/{print}' t  <=> awk '/^a/{print;print}/^b/{print}' t


這個(gè)不大對(duì)吧?

telfort1:/kfbuild/x144378>cat file
a
b
a
c
d
e
f
如果向你說(shuō)的那樣,模式相同的只保留一份模式.

telfort1:/kfbuild/x144378>awk '/^a//^b//^a/' file
a
a
b
a
a

結(jié)果應(yīng)該是
a
a
a
a
b
才對(duì)吧?
作者: lucash    時(shí)間: 2009-08-21 15:11
原帖由 ghostgorst 于 09-8-21 15:01 發(fā)表
awk '/^a/{print}/^b/{print}/^a/{print}' t   awk '/^a/{print;print}/^b/{print}' t


這個(gè)不大對(duì)吧?

telfort1:/kfbuild/x144378>cat file
a
b
a
c
d
e
f
如果向你說(shuō)的那樣,模式相同的只保留一 ...


我這里是這樣的:(你那里 awk '/^a//^b//^a/' t 不報(bào)錯(cuò)嗎)

Crys t:# cat k
a
b
a
c
d
e
f
Crys t:# awk '/^a/{print}/^b/{print}/^a/{print}' k
a
a
b
a
a
Crys t:# awk '/^a/{print;print}/^b/{print}' k
a
a
b
a
a
作者: ghostgorst    時(shí)間: 2009-08-21 15:15
標(biāo)題: 回復(fù) #28 lucash 的帖子
awk '/^a//^b//^a/' file
我這沒(méi)出錯(cuò)啊,不是說(shuō)模式的默認(rèn)動(dòng)作是打印么?我就沒(méi)寫.

反正沒(méi)出現(xiàn)
a
a
a
a
b
這樣的結(jié)果!
作者: lucash    時(shí)間: 2009-08-21 15:23
標(biāo)題: 回復(fù) #29 ghostgorst 的帖子
如果你認(rèn)為應(yīng)該出現(xiàn)
a
a
a
a
b
的話,那你理解錯(cuò)了,你這樣理解的話就是先讓所有行匹配完/^a/再讓所有行匹配一次/^b/了
記錄是一行一行來(lái)的阿
我沒(méi)有說(shuō)要出現(xiàn)這個(gè)阿。
作者: lucash    時(shí)間: 2009-08-21 15:31
原帖由 ghostgorst 于 09-8-21 15:15 發(fā)表
awk '/^a//^b//^a/' file
我這沒(méi)出錯(cuò)啊,不是說(shuō)模式的默認(rèn)動(dòng)作是打印么?我就沒(méi)寫.

反正沒(méi)出現(xiàn)
a
a
a
a
b
這樣的結(jié)果!


模式的默認(rèn)動(dòng)作是打印,但是多個(gè)模式都是打印又不想寫那個(gè){print}的時(shí)候我這里要用;分開(kāi)
作者: ghostgorst    時(shí)間: 2009-08-21 15:37
標(biāo)題: 回復(fù) #30 lucash 的帖子
呵呵我說(shuō)結(jié)果是
a
a
a
a
b
是說(shuō)錯(cuò)啦.

你說(shuō)的有道理啊,又多學(xué)了點(diǎn)知識(shí)
作者: ghostgorst    時(shí)間: 2009-08-21 15:45
標(biāo)題: 回復(fù) #31 lucash 的帖子
多個(gè)模式省略動(dòng)作的時(shí)候,最標(biāo)準(zhǔn)通用的方法是模式間加分號(hào)還是不加分號(hào)呢?
作者: mriconpc    時(shí)間: 2011-03-18 21:16

作者: baoyu05    時(shí)間: 2011-03-19 23:02
我的理解是,相當(dāng)于continue
作者: zhnghaijin    時(shí)間: 2011-06-08 16:28
本帖最后由 zhnghaijin 于 2011-06-08 16:31 編輯

結(jié)合黑哥的比喻,我理解應(yīng)該是說(shuō):
辦理入學(xué)手續(xù)的時(shí)候,如果你已經(jīng)交費(fèi)的話(也就是符合匹配要求),那么繼續(xù)辦理入學(xué)手續(xù),然后認(rèn)識(shí)新同學(xué)。
如果你沒(méi)有交費(fèi)的話(也就是不符合匹配要求),那就不能給你辦理入學(xué)手續(xù)(匹配的步驟不再執(zhí)行),但是next ,去認(rèn)識(shí)新同學(xué)。認(rèn)識(shí)新同學(xué)和你有沒(méi)有交學(xué)費(fèi)無(wú)關(guān)。沒(méi)錢也是可以念大學(xué)的。。
作者: h200952709    時(shí)間: 2011-06-08 16:31
next 哦
作者: fangtong2008    時(shí)間: 2011-07-02 19:34
學(xué)習(xí)了!。。。。!
作者: yuloveban    時(shí)間: 2011-07-02 21:39
哈哈,各位分享,學(xué)習(xí)了!
作者: linux_kaige    時(shí)間: 2011-12-27 16:11
回復(fù) 19# 小木蟲子
很有說(shuō)服力,學(xué)習(xí)了!今天也遇到next的問(wèn)題了。。。


   
作者: czq_linux    時(shí)間: 2014-02-11 17:05
紅帽頭像的 講的很透徹,學(xué)習(xí)了。awk 目前還是好工具
作者: freeterman    時(shí)間: 2015-09-11 17:35
帥哥 你是要這個(gè)嗎

[root@S997235 ~]# less 1
a b c d e f g
abcd
1234
[root@S997235 ~]# awk '/^a/{next}{print $0}' 1
1234




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2