免费注册 查看新帖 |

Chinaunix

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

让文本文件的行内容乱序储存  关闭 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2003-11-11 11:09 |只看该作者

让文本文件的行内容乱序储存

我写了一个程序,大家来看看吧。。。

数据文件: testfile
$cat testfile
1  --- I
2  --- L
3  --- O
4  --- V
5  --- E
6  --- Y
7  --- O
8  --- U
9  --- !
10 --- !

$rand_output.sh testfile
5  --- E
1  --- I
3  --- O
10 --- !
7  --- O
2  --- L
4  --- V
8  --- U
9  --- !
6  --- Y

$cat rand_output.sh


#!/bin/csh -f

set FILE = $1

set max_line_num = `wc -l $FILE | awk '{print $1}'`

nawk -v max_line=$max_line_num -f rand_out.awk $FILE > $FILE.randout

foreach LINE (`cat ${FILE}.randout`)

  awk '{if(NR == "'$LINE'"print;next;}' $FILE

end


$cat rand_out.awk


BEGIN{
       FS = " ";
       #max_line = 10 #max_line_num ;
       end_line = max_line+1;
       rand_line_now = 0;
       for(i=1;i<end_line;i++)line = 0;
       complete=0;
       current_line=1;
       no_same = 0;

       do
       {
        do
        {

         rand_line_now = int((rand()*end_line));

        }while( rand_line_now == 0 || rand_line_now >= end_line  )

       if(line[current_line]==0)
        line[current_line] = rand_line_now;
       else continue;

       j=1;
       no_same=1;
       while(j<current_line && no_same==1)
       {
         if(line[j] == line[current_line])
         {
                 no_same = 0
                 line[current_line] = 0;
         }
         else
         {
                 j++;
                 no_same=1;
         }
        }

       if(j==current_line && no_same==1 && current_line < max_line)
         current_line++;

       if(current_line == max_line && line[max_line] != 0 && no_same == 1 ) complete = 1;

       }while( complete == 0 )

    }

END{
   for(k=1;k<end_line;k++)
     print line[k];
   }


实际上我的想法是利用 awk 的rand来生成一个数据文件行数的随机
排列,然后保存这个排列,最后按照该排列重新输出文件。 其实如果
用C来实现可能会更简单,而且随机性更强,但用awk来实现会比较
方便,如果再加工一下可以作为简单的文本加密程序来处理一些敏感
信息的文本了。。 (只要把输出的随机行数列表保存在按照正常顺序
输出就行了)。 这里比较麻烦的处理就是怎么得到合法的随机数,并且
是不允许跟其他已经得到的数重复的,其他就没啥了~~~

                      

论坛徽章:
0
2 [报告]
发表于 2003-11-11 14:12 |只看该作者

让文本文件的行内容乱序储存

应该再弄个还原的scripts就齐了,给MM发过去,应该还算比较好玩。。。。 :))

    。。。。没人捧场说。。:(
Greenergy 该用户已被删除
3 [报告]
发表于 2003-11-11 20:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2003-11-11 22:09 |只看该作者

让文本文件的行内容乱序储存

就是打乱可以,怎么还原啊...........

论坛徽章:
0
5 [报告]
发表于 2003-11-12 09:41 |只看该作者

让文本文件的行内容乱序储存

原帖由 "Greenergy" 发表:

sunkey, csh,太好了.

有csh的问题向你请教


   分特。。差太远,我也是现学现卖, 多来这里,跟大家学的。。。

                 

论坛徽章:
0
6 [报告]
发表于 2003-11-12 10:44 |只看该作者

让文本文件的行内容乱序储存

[quote]原帖由 "光明晓仙"]就是打乱可以,怎么还原啊...........[/quote 发表:


因为这个程序本身就是随机产生一组行号排列,还原就把产生的随机
排列再按照顺序换回去就是了。 假如利用楼上的随机排序产生的随机
乱排的文本为:

$cat 2u


#5  --- E;
#1  --- I;
#3  --- O;
#10 --- !;
#7  --- O;
#2  --- L;
#4  --- V;
#8  --- U;
#9  --- !;
#6  --- Y;


利用下面的程序即可还原:
$ rand_input.sh 2u

#1 --- I;
#2 --- L;
#3 --- O;
#4 --- V;
#5 --- E;
#6 --- Y;
#7 --- O;
#8 --- U;
#9 --- !;
#10 --- !;


其中代码如下:
$cat rand_input.sh


#!/bin/csh -f

set FILE = $1
set rand_num_file = ${FILE}.randout

set max_line_num = `wc -l $FILE | awk '{print $1}'`

nawk -v max_line=${max_line_num} -v rf=${rand_num_file} -f rand_in.awk $FILE | sort -n | nawk '{$1="";print;next;}'



$cat rand_in.awk

BEGIN{
       FS = " ";
       end_line = max_line+1;
       for(i=1;i<end_line;i++)line = " ";
      }
      
     {
       line[NR] = $0;
       while( (getline < rf ) > 0)
       {
               line_num = $0;
               break;
        }
        print line_num " " line[NR];
        next ;
      }
END{close(rf);  exit 1; }


其中, ${FILE}.randout  就是利用楼上程序产生的一个随机排序列
必须有这个文件才可以还原成原来的文本了。。。。
可以找一个比较大的文本来转换试试看。。。嘿嘿。。。。

        :emn4:          

论坛徽章:
0
7 [报告]
发表于 2003-11-12 14:40 |只看该作者

让文本文件的行内容乱序储存

精华~~~

论坛徽章:
0
8 [报告]
发表于 2003-11-12 14:46 |只看该作者

让文本文件的行内容乱序储存

高手,俺佩服,建议给sunkey 加俩精华..........

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-11-12 15:44 |只看该作者

让文本文件的行内容乱序储存

支持!

论坛徽章:
0
10 [报告]
发表于 2003-11-12 16:50 |只看该作者

让文本文件的行内容乱序储存

[quote]原帖由 "光明晓仙"]高手,俺佩服,建议给sunkey 加俩精华..........[/quote 发表:


  哈。。。惭愧惭愧。。。其实都是跟这里学来的~~
  要不是经常来这向大家学习,我根本不知道啥是awk、sed说。。。。

                 
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP