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

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

Chinaunix

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

[文本處理] awk中關(guān)于FNR和NR的例子,請(qǐng)高手賜教 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-07-24 17:17 |只看該作者 |倒序?yàn)g覽
看到一個(gè)關(guān)于awk的案例,AIX下話說(shuō)有兩個(gè)數(shù)據(jù)文件,分別為
1.txt,內(nèi)容:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401

2.txt,內(nèi)容:
I0011  11111
I0012  22222
I0014  55555
I0013  66666

目的是利用awk命令,比較1.txt的1-4字符 和 2.txt的2-5 字符,如果相同,將2.txt 的第二列 與 1.txt 合并
需要取得效果如下:
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555

命令是:
awk 'NR==FNR {a[substr($1,2,5)]=$2} NR>FNR && a[b=substr($1,1,4)] {print $0,a[b]}'  2.txt 1.txt

有沒有awk高手能夠詳細(xì)解釋一下上述命令的實(shí)現(xiàn)過程?謝謝了

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-07-24 17:17 |只看該作者
我自己是這么理解的
命令是:
awk 'NR==FNR {a[substr($1,2,5)]=$2} NR>FNR && a[b=substr($1,1,4)] {print $0,a[b]}'  2.txt 1.txt

將命令分為兩個(gè)部分。
(1)先解析NR==FNR {a[substr($1,2,5)]=$2}
對(duì)于NR,讀取行數(shù)分別為1234(2.txt),5678(1.txt)
對(duì)于FNR,讀取行數(shù)分別為1234(2.txt),1234(1.txt)
因此NR==FNR的范圍就在2.txt文件里了,substr函數(shù)得出的是:
a[0011]=$2=11111
a[0012]=$2=22222
a[0013]=$2=33333
a[0014]=$2=44444

(2)再來(lái)看NR>FNR && a[b=substr($1,1,4)] {print $0,a[b]}這一部分
NR>FNR的范圍實(shí)在1.txt文件里,substr函數(shù)得出的是:
a[b=0011]
a[b=0012]
a[b=0013]
a[b=0014]
以上數(shù)組是在(1)中已經(jīng)賦值了
再print $0,a[b],此處的$0是范圍在1.txt里的

得出最后的結(jié)果

不知道我分析的過程對(duì)不對(duì),還希望大家來(lái)指正

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-07-24 17:20 |只看該作者
最近在學(xué)習(xí)awk,有個(gè)高人總結(jié)的awk經(jīng)驗(yàn),貼出來(lái)跟大家分享:
awk的出錯(cuò)提示不怎么友好,經(jīng)常報(bào)錯(cuò)讓摸不著頭腦,所以要對(duì)它的格式某些地方特別敏感!這里我根據(jù)經(jīng)驗(yàn)特別說(shuō)明如下幾點(diǎn):
1、awk 后面的語(yǔ)句一定要有兩個(gè)’’ 包含起來(lái)!
2、一定要有一個(gè)文本的輸入,可以放在后面,如本例的file,也可以通過管道符如|傳給awk
如 ls |awk ‘{print $1}’ 這個(gè)時(shí)候的輸入文件就是把ls的結(jié)果輸給awk去處理!
3、-F參數(shù)是用來(lái)控制分割符的,比如 cat ljb.txt |awk –F “;” ‘{print $1,$2}’表示將ljb.txt文件中的內(nèi)容的分號(hào)做為分割符,打印出第一列和第二列的值。這里要特別注意awk –F”;” 命令中,-F和”;”是沒有空格的。
4、awk中的==表示等于,而=表示賦值,如果輸錯(cuò)了,結(jié)果就完全錯(cuò)了。
比如 cat ljb.txt |awk ‘{if($3==6) print $0}’表示如果ljb.txt中默認(rèn)以空格分割,假如第三列值為6,打印出來(lái),如果這里將==寫=,那就會(huì)打印出所有的值,其中第三列都被更新為6!
5、判斷語(yǔ)句要有括號(hào)
如if($3==6)
6、這里我跳出AWK說(shuō)一下SHELL,SHELL的[]中往往是判斷,類似為
if [ $1=2 ]等,這里有別于awk,shell這個(gè)時(shí)候其實(shí)就是表示等于而不是賦值,如果你把=改寫成兩個(gè)=的==,那反而出錯(cuò)了,另外SHELL中也要留意,這里[]中的代碼不能頂在[]的兩邊,如:[$1=2]或者是[$1=2 ]和[ $1=2]都是錯(cuò)誤的!
7、整理了shell比較有別于其他編寫程語(yǔ)句的一些特定腳本寫法,現(xiàn)將awk 相關(guān)部分特別含義寫法整理如下:
ARGC             命令行參數(shù)個(gè)數(shù)
ARGV             命令行參數(shù)排列
ENVIRON          支持隊(duì)列中系統(tǒng)環(huán)境變量的使用
FILENAME         awk瀏覽的文件名
FNR               瀏覽文件的記錄數(shù)
FS                設(shè)置輸入域分隔符,等價(jià)于命令行- F選項(xiàng)
NF                瀏覽記錄的域個(gè)數(shù)
NR                已讀的記錄數(shù)
OFS               輸出域分隔符
ORS               輸出記錄分隔符
RS                控制記錄分隔符

論壇徽章:
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
4 [報(bào)告]
發(fā)表于 2012-07-24 17:22 |只看該作者
NR==FNR處理第一個(gè)數(shù)據(jù)文件
NR>FNR處理其它數(shù)據(jù)文件

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-07-24 17:29 |只看該作者
回復(fù) 1# liangzij


    好長(zhǎng)。。
只提一點(diǎn):
NR表示總記錄數(shù)
FNR表示當(dāng)前文件記錄數(shù)

簡(jiǎn)單的例子,A文件10行 B文件20行,awk xxxx命令  A B 的時(shí)候,NR和FNR同時(shí)計(jì)數(shù),當(dāng)處理完A文件的記錄后(FNR=10,NR=10),F(xiàn)NR重置后(FNR=1,2...)重新為B文件計(jì)數(shù),而NR繼續(xù)累積(NR=11,12...)
所以NR==FNR就是只對(duì)第一個(gè)文件進(jìn)行處理,NR>FNR就是只對(duì)后面的文件處理(不一定是第二個(gè),也可以是第三個(gè),看awk后面跟的文件個(gè)數(shù))

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-07-25 08:35 |只看該作者
建議用FILENAME來(lái)對(duì)輸入文件做區(qū)分

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-07-25 12:29 |只看該作者
FILENAME怎么區(qū)分呢?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-07-25 12:31 |只看該作者
本帖最后由 personball 于 2012-07-25 12:32 編輯

回復(fù) 7# liangzij

舉個(gè)例子。。
    awk 'FILENAME=="new.conf"{do sth...;next}{do sth...}' new.conf 1.conf 2.conf

源自:http://72891.cn/thread-3760955-1-1.html

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-07-25 12:37 |只看該作者
回復(fù) 8# personball


   謝謝 personball和其他朋友的幫忙
您需要登錄后才可以回帖 登錄 | 注冊(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ū)
中國(guó)互聯(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