藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教如何用awk在這個文件裡得到NF

主機每天有一張報表,只有一行,但字符卻有一千多個,我想以"|"為分隔符,取到指定字段,但如下awk卻不行

[code]awk -F"|"  '{if (NF=30) print $NF}' rpt0808.dat

awk: record'521311501|沙區街儲蓄所...' has too many fields input record number 2, file - soruce line 1 of program << {print NF} >>

$wc rpt0808.dat
0      2  1410   rpt0808.dat
[/code]

就是因為這一行太長而報錯, 那要怎麼做才能實現.謝謝

-->

請教如何用awk在這個文件裡得到NF

NF=30 ?

NF可以賦值的麼?

請教如何用awk在這個文件裡得到NF

我的是sco unix 5.0.5 ,ksh,這樣做是可以的

$echo "521311501|沙區街儲蓄所      |2005/03/31 " | awk -F"|"  '{if (NF=2) print $NF}'

沙區街儲蓄所

本來這shell行應該是沒問題的,可就是源文件只有特長的一行,造成awk失敗

請教如何用awk在這個文件裡得到NF

如果能運行
那麼 if (NF=2) print $NF
等效於 NF=2;print $NF
也就是print $2

如果你是相要最後一列數值
請用 awk -F '|' '{print $(NF-1)'
注意你的最後一列是空的,次後列才是數值

請教如何用awk在這個文件裡得到NF

if (NF=2) print $NF
NF=2;print $NF
print $2
awk -F '|' '{print $(NF-1)'
都行,在正常的文本是可以實現
可現在我那個文件只有一行,卻有上千個字符,以"|"分隔會有上百個的字段
我只要比如第80或90個字段,就無法實現了,awk會報錯行太長....

請教如何用awk在這個文件裡得到NF

那你就
sed 's/|/\n/' file | sed -n 80p
用行來取

sco:mrgreen:

請教如何用awk在這個文件裡得到NF

sed對這個文件也無效,執行無輸出
乾脆我把這個源文件傳上來,老大們幫著研究研究吧,謝謝
(只能改為.jpg上傳了,改改後綴即可)

請教如何用awk在這個文件裡得到NF

不知道樓主到底是什麼問題,你看看我的輸出吧:
[lj@cool ~]$ [color=red]cat rpt0808.txt[/color]
521311501|沙區街儲蓄所                      |2005/03/31|0|0|0.00|0|0|0.00|9|44410.26|9|44410.26|0.00|0|0|0.00|0|0|0.00|39|320326.98|39|320326.98|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|6|0|114000.00|2|0|25047.52|1117|14367135.49|1121|14456087.97|0.00|0|0|0.00|0|0|0.00|97|840233.80|97|840233.80|0.00|0|0|0.00|1|0|25000.00|113|1196118.93|112|1171118.93|0.00|0|0|0.00|0|0|0.00|21|219800.00|21|219800.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|6|0|114000.00|3|0|50047.52|1396|16988025.46|1399|17051977.94|0.00|0|0|0.00|0|0|0.00|22|56720.00|22|56720.00|0.00|0|0|0.00|0|0|0.00|4|12900.00|4|12900.00|0.00|0|0|0.00|0|0|0.00|2|2160.00|2|2160.00|0.00|0|0|0.00|0|0|0.00|28|71780.00|28|71780.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|6|0|114000.00|3|0|50047.52|1424|17059805.46|1427|17123757.94|0.00|17|43|1587552.80|0|95|678964.00|10341|11196028.07|10358|12104616.87|0.00|0|0|0.00|0|0|0.00|17|31830.00|17|31830.00|0.00|0|0|0.00|0|0|0.00|0|0.00|0|0.00|0.00|23|43|1701552.80|3|95|729011.52|11782|28287663.53|11802|29260204.81|0.00|[lj@cool ~]$
[color=red][lj@cool ~]$ awk -F"|"  '{if (NF=30) print $NF}' rpt0808.txt
0
[lj@cool ~]$ awk -F"|"  '{if (NF=80) print $NF}' rpt0808.txt
0.00[/color]

請教如何用awk在這個文件裡得到NF

sed 's/|/\n/' file | sed -n 80p
用行來取

思路我也理解的,但將 | 改為回車這代碼有誤,不知該怎麼改

請教如何用awk在這個文件裡得到NF

暈死,難道這又是sco 和 linux的區別 :-(
sco不能處理長度超長的行,而linux卻可以..
如果sco能像老大那樣簡單的處理就好了,我開始就是那樣做的,誰知道sco 又#$@#$@#$^%&^%*

請教如何用awk在這個文件裡得到NF

-->
不能這樣嗎?
[lj@cool ~]$ sed -e 's/|/\n/g' rpt0808.dat | sed -n '80p'
0.00

請教如何用awk在這個文件裡得到NF

-->
我很同情你啊,呵呵。但是,我剛才看到這個帖子的時候沒有多想你是否用linux,真不好意思。給了沒用的辦法

請教如何用awk在這個文件裡得到NF

我可以取得出來!!呼哇~~~~~~
$ awk -F '|' '{print $90}' bank.rpt
0.00

請教如何用awk在這個文件裡得到NF

sed -e 's/|/\n/g' file
我在正常的文本中替換出來是 nSTR...
就是沒把\n回車換行替換出來,,而只替換出了n

還是謝謝了,沒想到sco真的是老了...
碰到這種超長的行,awk會報錯,sed雖不報錯,但也不會得到任何結果
唉,頭都痛了

請教如何用awk在這個文件裡得到NF

有tr麼?
tr '|' '\n' <file |sed -n 80p

請教如何用awk在這個文件裡得到NF

waker真歷害啊

tr '|' '\n' <file |sed -n 80p

GOOD,果然搞定了,把分隔符"|"替換為回車,想要哪個字段,在 XXp裡改就是了,牛.........thx,太謝謝了

請教如何用awk在這個文件裡得到NF

能直接用awk和sed處理這種文本的,awk和sed 都不會是sco 5.0.5下的吧
可惜我不能升級到linux,要不然就不會有這麼多不是問題的問題,不過這樣也能學到更多的處理方法吧



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com