免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1437 | 回复: 9
打印 上一主题 下一主题

文件转换问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-25 12:29 |只看该作者 |倒序浏览
我有一文本:a.txt
2005|C|   2|        8985.60
2101|C|   2|         723.20
2101|D|   2|        1684.00
3004|C|   3|       27967.60
7101|C|   2|         320.00
7120|D|   2|       330.00
我希望转变为
2005|2|8985.60|0|0
2101|2|723.20|2|1684.00
3004|3|27967.60|0|0
7101|2|320.00|0|0
7120|0|0|2|330.00
也就是说,若有第一域相同的两条记录,则将第二域为D的记录的第三,第四域加入在第一条记录后面,若没有则以0加入.

论坛徽章:
0
2 [报告]
发表于 2005-03-25 14:20 |只看该作者

文件转换问题

sed -e 's/  *//g' filename

论坛徽章:
0
3 [报告]
发表于 2005-03-25 14:43 |只看该作者

文件转换问题

[quote]原帖由 "creat7151"]sed -e 's/  *//g' filename[/quote 发表:

谢谢回复,但你没理解我的意思。

论坛徽章:
0
4 [报告]
发表于 2005-03-25 15:15 |只看该作者

文件转换问题

你的文件有多大,有多少记录,如果记录太多,而且没有按第一个域排好序的话,建议你先用数据库的相关软件对文件排序,再整理

论坛徽章:
0
5 [报告]
发表于 2005-03-25 15:35 |只看该作者

文件转换问题

前面相同,后面为D的记录是不是最多为两个(或者其它确定的数)?如果是,可以先sort,再用awk完成。

论坛徽章:
0
6 [报告]
发表于 2005-03-25 15:43 |只看该作者

文件转换问题

[quote]原帖由 "aerofox"]前面相同,后面为D的记录是不是最多为两个(或者其它确定的数)?如果是,可以先sort,再用awk完成。[/quote 发表:

前面相同的最多两条记录,既后面为C或D,

论坛徽章:
0
7 [报告]
发表于 2005-03-25 17:23 |只看该作者

文件转换问题

这样试试吧:
var1=" "
read filename
if ( test -f filename1 );then
   rm filename1
fi
touch filename1
chmod 0777 filename1
sort $filename > filename1
mv filename1 $filename
while read LINE
do
   var=`echo "$LINE"|cut -d\| -f 1`
   echo "var is: "$var
   if (( var1 == var ))
   then
      echo $var"|"$field1$field2"|"$field1`echo "$LINE"|awk '{print $3}'`
   else
      echo $var"|"`echo "$LINE"|awk '{print $2}'``echo "$LINE"|awk '{print $3}'`"|0|0"
   fi
   var1=$var
   field1=`echo "$LINE"|awk '{print $2}'`
   field2=`echo "$LINE"|awk '{print $2}'`
done < $filename

论坛徽章:
0
8 [报告]
发表于 2005-03-25 17:24 |只看该作者

文件转换问题

这样试试吧:
var1=" "
read filename
if ( test -f filename1 );then
   rm filename1
fi
touch filename1
chmod 0777 filename1
sort $filename > filename1
mv filename1 $filename
while read LINE
do
   var=`echo "$LINE"|cut -d\| -f 1`
   echo "var is: "$var
   if (( var1 == var ))
   then
      echo $var"|"$field1$field2"|"$field1`echo "$LINE"|awk '{print $3}'`
   else
      echo $var"|"`echo "$LINE"|awk '{print $2}'``echo "$LINE"|awk '{print $3}'`"|0|0"
   fi
   var1=$var
   field1=`echo "$LINE"|awk '{print $2}'`
   field2=`echo "$LINE"|awk '{print $2}'`
done < $filename

论坛徽章:
0
9 [报告]
发表于 2005-03-25 17:42 |只看该作者

文件转换问题

楼主:最后结果7120|0|0|2|330.00 这行不对啊,不是0要加在后面吗?
  1. awk 'BEGIN{FS="|";IFS="|"}{if(a[$1]!=""){a[$1]=a[$1]"|"$3/1"|"$4/1;b[$1]+=1}else{a[$1]=$3/1"|"$4/1}}END{for(x in a){if(b[x]>0){print x"|"a[x]}else{print x"|"a[x]"|0|0"}}}' filename
复制代码

不过这样不能保留小数点后两位了

论坛徽章:
0
10 [报告]
发表于 2005-03-26 11:36 |只看该作者

文件转换问题

试试这个,如果用的是csh,则除最后一行外每行末尾加个\,或者把放到一行来。
  1. sort a.txt | awk -F\| '{
  2.     if($1==ID)
  3.     {
  4.         printf("|%s|%s\n", $3, $4);
  5.         X=0;
  6.     }
  7.     else
  8.     {
  9.         if(X>0) printf("|0|0\n");
  10.         printf("%s|%s", $1, $2);
  11.         X=1;
  12.     }
  13. }'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP