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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 18434 | 回復(fù): 17
打印 上一主題 下一主題

awk的sub與gsub [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-07-22 18:14 |只看該作者 |倒序?yàn)g覽
有如下文件a.log
1abc 2abc
3abc 4abc
5abc 6abc
(列之間是\t)
awk 'FS="\t" gsub(/a/,"A")' a.log 輸出正確
但是
awk 'FS="\t" gsub(/a/,"A",$1)' a.log 輸出不正確:
1Abc 2abc
3Abc 4Abc
5Abc 6Abc
察看:
awk 'FS="\t" gsub(/a/,"A",$1) {print $2}' a.log
發(fā)現(xiàn)只有2abc,與出現(xiàn)的錯(cuò)誤一致。
但是同時(shí)
awk 'gsub(/a/,"A",$1)' a.log正確
awk 'FS="\t" sub(/a/,"A",$1)' a.log正確
感覺和FS=xxx有關(guān)系,可究竟是為什么呢?

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2007-07-22 20:39 |只看該作者
sub匹配第一次出現(xiàn)的,gsub匹配所有的,與sed 's//' 和sed 's//g'一致。

你試試這個(gè)就知道是什么原因了。awk 'FS="\t" {print $1}' a.log

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
3 [報(bào)告]
發(fā)表于 2007-07-23 00:46 |只看該作者
awk默認(rèn)的分隔域是空格, TAB, 所以你不需要指定FS的
/home/lee#echo '1abc 2abc
3abc 4abc
5abc 6abc'|awk '{sub(/a/,"A"0);print}'
1A0bc 2abc
3A0bc 4abc
5A0bc 6abc
/home/lee#echo '1abc 2abc
3abc 4abc
5abc 6abc'|awk '{gsub(/a/,"A"0);print}'
1A0bc 2A0bc
3A0bc 4A0bc
5A0bc 6A0bc
//g,指的是一行里所有的匹配

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2007-07-23 09:40 |只看該作者
這個(gè)問題頗有點(diǎn)古怪,F(xiàn)S的賦值方式明顯不對(duì),但執(zhí)行的結(jié)果也很難理解!
為什么第一行能夠執(zhí)行正確,但第二行數(shù)據(jù)就出現(xiàn)問題,而且似乎還影響了OFS,奇怪!
期待高手!

awk 'FS="\t"  gsub(/a/,"A",$1)'執(zhí)行結(jié)果

1Abc 2abc
3Abc    4Abc
5Abc    6Abc
第一行分隔符為空格,以下都是\t!

[ 本帖最后由 ruifox 于 2007-7-23 09:43 編輯 ]

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
5 [報(bào)告]
發(fā)表于 2007-07-23 09:48 |只看該作者
原帖由 ruifox 于 2007-7-23 09:40 發(fā)表
這個(gè)問題頗有點(diǎn)古怪,F(xiàn)S的賦值方式明顯不對(duì),但執(zhí)行的結(jié)果也很難理解!
為什么第一行能夠執(zhí)行正確,但第二行數(shù)據(jù)就出現(xiàn)問題,而且似乎還影響了OFS,奇怪!
期待高手!

awk 'FS="\t"  gsub(/a/,"A",$1)'執(zhí)行 ...

第一行FS="\t"以前域已經(jīng)拆分好了
第二行行才按\t拆分,結(jié)果是非常相當(dāng)?shù)恼5?br />

  1. Advanced Notes: Changing FS Does Not Affect the Fields

  2. According to the POSIX standard, awk is supposed to behave as if each record is split into fields at the time it is read. In particular, this means that if you change the value of FS after a record is read, the value of the fields (i.e., how they were split) should reflect the old value of FS, not the new one.

  3. However, many implementations of awk do not work this way. Instead, they defer splitting the fields until a field is actually referenced. The fields are split using the current value of FS! (d.c.) This behavior can be difficult to diagnose. The following example illustrates the difference between the two methods. (The sed18 command prints just the first line of /etc/passwd.)

  4.      sed 1q /etc/passwd | awk '{ FS = ":" ; print $1 }'

  5. which usually prints:

  6.      root

  7. on an incorrect implementation of awk, while gawk prints something like:

  8.      root:nSijPlPhZZwgE:0:0:Root:/:
復(fù)制代碼

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2007-07-23 14:26 |只看該作者
按照waker給出的解釋,如下代碼:
awk '{FS="\t"; gsub(/a/,"A",$1);print $0,NF}' filename
確實(shí)能夠工作,雖然FS賦值是無效的(awk默認(rèn)tab分割)

但是如下代碼:
awk 'FS="\t" gsub(/a/,"A",$1){print $0,NF}' filename
結(jié)果是錯(cuò)的。

他們的區(qū)別就是代碼塊的位置,以及是否用分號(hào)分隔。
因此我覺得問題仍然出在花括號(hào)和分號(hào)上面。雖然FS的賦值是失效的,但是應(yīng)該不影響結(jié)果才是。

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
7 [報(bào)告]
發(fā)表于 2007-07-23 14:32 |只看該作者
如果沒有特殊的設(shè)計(jì)
設(shè)置FS的傳統(tǒng)位置是
BEGIN{.....FS=xxx...}

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2007-07-23 14:45 |只看該作者
。。好吧。
那這個(gè)就算
GNU Awk 3.1.1
的bug好了。。

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
9 [報(bào)告]
發(fā)表于 2007-07-23 14:47 |只看該作者

  1. If you find a  bug  in  gawk,  please  send  electronic  mail  to  bug-
  2.        [email]gawk@gnu.org[/email].
復(fù)制代碼

論壇徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亞冠之浦和紅鉆
日期:2015-06-23 19:10:532015亞冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16賽季CBA聯(lián)賽之山東
日期:2016-01-31 18:25:0515-16賽季CBA聯(lián)賽之四川
日期:2016-02-16 16:08:30程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-06-29 06:20:002017金雞報(bào)曉
日期:2017-01-10 15:19:5615-16賽季CBA聯(lián)賽之佛山
日期:2017-02-27 20:41:19
10 [報(bào)告]
發(fā)表于 2007-07-23 14:54 |只看該作者
原帖由 philonis 于 2007-7-23 14:45 發(fā)表
。。好吧。
那這個(gè)就算
GNU Awk 3.1.1
的bug好了。。

如果你是gawk ,你會(huì)如何處理?
條件{動(dòng)作},這是awk基本方法,那么我們來看一個(gè)例子
$1==3{print }
如果awk在判斷條件$1==3之前不進(jìn)行域拆分,那么$1從什么地方來?
如果已經(jīng)拆分過了,那么你的 FS=xx{...}只會(huì)在下一行起作用而不會(huì)在本行
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP