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

Chinaunix

標題: awk中關于FNR和NR的例子,請高手賜教 [打印本頁]

作者: liangzij    時間: 2012-07-23 13:36
標題: awk中關于FNR和NR的例子,請高手賜教
看到一個關于awk的案例,AIX下話說有兩個數(shù)據(jù)文件,分別為
1.txt,內容:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401

2.txt,內容:
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高手能夠詳細解釋一下上述命令的實現(xiàn)過程?謝謝了
作者: liangzij    時間: 2012-07-23 14:54
自己幫忙頂一下,現(xiàn)在還有沒有人研究awk呢?
作者: 好運北京    時間: 2012-07-23 17:14
對這個木神馬研究
作者: liangzij    時間: 2012-07-23 17:20
awk高手解答一下唄
作者: liangzij    時間: 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)中已經賦值了
再print $0,a[b],此處的$0是范圍在1.txt里的

得出最后的結果

不知道我分析的過程對不對,還希望大家來討論)
作者: liangzij    時間: 2012-07-24 11:16
最近在學習awk,有個高人總結的awk經驗,貼出來跟大家分享:
awk的出錯提示不怎么友好,經常報錯讓摸不著頭腦,所以要對它的格式某些地方特別敏感!這里我根據(jù)經驗特別說明如下幾點:
1、awk 后面的語句一定要有兩個’’ 包含起來!
2、一定要有一個文本的輸入,可以放在后面,如本例的file,也可以通過管道符如|傳給awk
如 ls |awk ‘{print $1}’ 這個時候的輸入文件就是把ls的結果輸給awk去處理!
3、-F參數(shù)是用來控制分割符的,比如 cat ljb.txt |awk –F “;” ‘{print $1,$2}’表示將ljb.txt文件中的內容的分號做為分割符,打印出第一列和第二列的值。這里要特別注意awk –F”;” 命令中,-F和”;”是沒有空格的。
4、awk中的==表示等于,而=表示賦值,如果輸錯了,結果就完全錯了。
比如 cat ljb.txt |awk ‘{if($3==6) print $0}’表示如果ljb.txt中默認以空格分割,假如第三列值為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 相關部分特別含義寫法整理如下:
ARGC             命令行參數(shù)個數(shù)
ARGV             命令行參數(shù)排列
ENVIRON          支持隊列中系統(tǒng)環(huán)境變量的使用
FILENAME         awk瀏覽的文件名
FNR               瀏覽文件的記錄數(shù)
FS                設置輸入域分隔符,等價于命令行- F選項
NF                瀏覽記錄的域個數(shù)
NR                已讀的記錄數(shù)
OFS               輸出域分隔符
ORS               輸出記錄分隔符
RS                控制記錄分隔符
作者: yzkarchive    時間: 2012-07-24 11:21
你去shell版塊中,很快就有人給你講解了,而且會很詳細
作者: liangzij    時間: 2012-07-24 17:16
謝謝樓上的朋友




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