歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 合並某些行

合並某些行

日期:2017/2/27 14:15:27   编辑:更多Linux
  例如有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無關。



Copyright © Linux教程網 All Rights Reserved