例如有test.txt文件
1 aaa 1000
2 bbb 1000
3 aaa 1000
4 aaa 1000
5 ccc 1000
6 bbb 1000
要求產生新文件格式為
1 aaa 3000
2 bbb 2000
5 ccc 1000
寫的有些復雜,我也沒什麼好方法
#!/usr/bin/ksh
awk '{print $2 }' 1.txt sort -u > ./1.txt.tmp
while read keyWord
do
keyno=0
keyvalue=0
grep $keyword 1.txt while read no nouse value
do
if [ $keyno -ge $no -o $keyno -eq 0 ]
then
keyno=$no
fi
(( keyvalue=keyvalue + value ))
done
echo "$keyno $keyword $keyvalue"
done<1.txt.tmp > 2.txt
rm -f ./1.txt.tmp
echo "aaa `cat test.txtawk '{if($1~/aaa/) print $2}'awk '{kkk+=$1}END{printf "%9.2f" , kkk}'`" > test.out
echo "bbb `cat test.txtawk '{if($1~/bbb/) print $2}'awk '{kkk+=$1}END{printf "%9.2f" , kkk}'`" >> test.out
echo "ccc `cat test.txtawk '{if($1~/ccc/) print $2}'awk '{kkk+=$1}END{printf "%9.2f" , kkk}'`" >> test.out
biansj,你的程序不是不行,bsh可以嗎?
一面字我打錯了,程序不能運行,bsh可以嗎?
編輯 發貼時間2002/12/14 09:48am 此 IP 為代理服務器IP: 已設置保密
該用戶目前不在線 nhrms
去掉第一行:
awk '{print $2 }' 1.txt sort -u > ./1.txt.tmp
while read keyword
do
keyno=0
keyvalue=0
grep $keyword 1.txt while read no nouse value
do
if [ $keyno -ge $no -o $keyno -eq 0 ]
then
keyno=$no
fi
(( keyvalue=keyvalue + value ))
done
echo "$keyno $keyword $keyvalue"
done<1.txt.tmp > 2.txt
rm -f ./1.txt.tmp
運行後提示:
+:not found
#!/usr/bin/bsh
awk '{print $2 }' 1.txt sort -u > ./1.txt.tmp
while read keyword
do
keyno=0
keyvalue=0
grep $keyword 1.txt while read no nouse value
do
if [ $keyno -ge $no -o $keyno -eq 0 ]
then
keyno=$no
fi
keyvalue=`eXPr $keyvalue + $value`
#(( keyvalue=keyvalue + value ))
done
echo "$keyno $keyword $keyvalue"
done<1.txt.tmp > 2.txt
rm -f ./1.txt.tmp
運行後,輸出:
0 aaa 0
0 bbb 0
0 ccc 0
不對!
你把我寫的內容C&P一個文件file,chmod +x file,然後運行./file
注意1.txt要在當前目錄,結果為2.txt,如果不對,我就不清楚了
我剛才就是這麼做的,出來結果就這樣
改成這樣就可以了。
代碼:
awk '{print $2 }' test.txt sort -u > ./1.txt.tmp
while read keyword
do
keyno=0
keyvalue=0
grep $keyword test.txt > 2.txt.tmp
while read no nouse value
do
if [ $keyno -ge $no -o $keyno -eq 0 ]
then
keyno=$no
fi
keyvalue=`expr $keyvalue + $value`
done < 2.txt.tmp
echo "$keyno $keyword $keyvalue"
done <1.txt.tmp
rm -f ./[12].txt.tmp
環境為PC SOLARIS 7。
上邊的還是執行不了,俺看一下,原來在執行
awk '{print $2 }' test.txt sort -u > ./1.txt.tmp 時,產生的文件 1.txt.tmp
的頭兩行為空格,導致腳本執行不好。俺把那行改一下,變為兩行:
-------------------------------------------------
awk '{print $2 }' 1.txt sort -u > ./1.txt.temp
grep -v "^ *$" 1.txt.temp > 1.txt.tmp
------------------------------------------------
執行正常:
------------------------------------------------
# ./sortnadd
0+1 aaa 3000
0+2 bbb 2000
0+5 ccc 1000
-----------------------------------------------
哪位高手指點一下,為何有空行?
0+1 aaa 3000
0+1 啥子意思?
樓上貼子作廢啊,SORRY,我自己把自己騙了
樓上各位有考慮過如果原始數據量很大(比如5萬條、50萬條?)時執行效率的問題嗎?
如果處理每個關鍵字都要掃描一下源文件的話似乎太慢了?
#!/bin/sh
sort +1 -2 test.txt > 1.txt
awk 'BEGIN{no=-1;}{if (no==-1){no=$1;k=$2;tot=0;}
if (k==$2) {tot+=$3;}
else{printf "%d %s %d
", no,k,tot;
no=$1; k=$2; tot=$3;} }
END{printf "%d %s %d
", no,k,tot;}' 1.txt > output.txt
rm -f 1.txt
sort +1 -2 啥子意思?
http://www.fanqiang.com/a1/b5/20010923/0805001336.Html
這個問題的本質還是分組求和問題,第一個自定相對來說無甚含義,因此我簡單的給出下面的答案:
awk '{total[$2]+=$3}END{for (s in total){printf("%s %d
",s,total[s])}' 1.txt
斑竹,這是什麼shell?ksh 好象不可以
下面引用由紅豆在 2002/12/16 01:17am 發表的內容:
改成這樣就可以了。
awk '{print $2 }' test.txt sort -u > ./1.txt.tmp
while read keyword
do
...
為什麼運行後 總是
0 aaa 0
0 bbb 0
0 ccc 0
哪裡不可以?
這是awk的問題,如果你引號用的對的話,有shell無關。
改成這樣就可以了。
awk '{print $2 }' test.txt sort -u > ./1.txt.tmp
while read keyword
do
...
為什麼運行後 總是
0 aaa 0
0 bbb 0
0 ccc 0
哪裡不可以?
這是awk的問題,如果你引號用的對的話,有shell無關。