|
藍森林 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,要不然就不會有這麼多不是問題的問題,不過這樣也能學到更多的處理方法吧 |
| |