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

  免費注冊 查看新帖 |

Chinaunix

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

[高級應(yīng)用] awk中關(guān)于FNR和NR的例子,請高手賜教 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-07-23 13:36 |只看該作者 |倒序瀏覽
看到一個關(guān)于awk的案例,AIX下話說有兩個數(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ì)解釋一下上述命令的實現(xiàn)過程?謝謝了

論壇徽章:
0
2 [報告]
發(fā)表于 2012-07-23 14:54 |只看該作者
自己幫忙頂一下,現(xiàn)在還有沒有人研究awk呢?

論壇徽章:
0
3 [報告]
發(fā)表于 2012-07-23 17:14 |只看該作者
對這個木神馬研究

論壇徽章:
0
4 [報告]
發(fā)表于 2012-07-23 17:20 |只看該作者
awk高手解答一下唄

論壇徽章:
0
5 [報告]
發(fā)表于 2012-07-23 17:30 |只看該作者
我自己是這么理解的
命令是:
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

將命令分為兩個部分。
(1)先解析NR==FNR {a[substr($1,2,5)]=$2}
對于NR,讀取行數(shù)分別為1234(2.txt),5678(1.txt)
對于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)再來看NR>FNR && a[b=substr($1,1,4)] {print $0,a[b]}這一部分
NR>FNR的范圍實在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é)果

不知道我分析的過程對不對,還希望大家來討論)

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

論壇徽章:
15
CU大牛徽章
日期:2013-03-13 15:32:35白羊座
日期:2013-10-30 13:11:16未羊
日期:2013-11-29 10:47:02白羊座
日期:2014-01-22 11:34:25白羊座
日期:2014-03-04 11:05:50申猴
日期:2014-07-29 16:31:36天秤座
日期:2013-10-23 15:33:47未羊
日期:2013-10-09 09:18:53CU大;照
日期:2013-03-13 15:38:15CU大;照
日期:2013-03-13 15:38:52CU大;照
日期:2013-03-14 14:08:55未羊
日期:2013-09-23 09:29:22
7 [報告]
發(fā)表于 2012-07-24 11:21 |只看該作者
你去shell版塊中,很快就有人給你講解了,而且會很詳細(xì)

論壇徽章:
0
8 [報告]
發(fā)表于 2012-07-24 17:16 |只看該作者
謝謝樓上的朋友
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP