iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >有哪些用Shell脚本实现乱序排列文件内容的方法
  • 593
分享到

有哪些用Shell脚本实现乱序排列文件内容的方法

2023-06-09 18:06:49 593人浏览 八月长安
摘要

本篇内容主要讲解“有哪些用shell脚本实现乱序排列文件内容的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些用Shell脚本实现乱序排列文件内容的方法”吧!洗牌问题:洗一副扑克,有什么

本篇内容主要讲解“有哪些用shell脚本实现乱序排列文件内容的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些用Shell脚本实现乱序排列文件内容的方法”吧!

洗牌问题:洗一副扑克,有什么好办法?既能洗得均匀,又能洗得快?即相对于一个文件来说怎样高效率的实现乱序排列?

ChinaUnix 确实是 Shell 高手云集的地方,只要你想得到的问题,到那里基本上都能找到答案。r2007 给出了一个取巧的方法,利用 Shell 的 $RANDOM 变量给原文件的每一行加上随机的行号然后根据这个随机行号进行排序,再把临时加上去的行号给过滤掉,这样操作之后得到的新文件就相当于被随机“洗”了一次:

代码如下:

while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1


当然如果你的源文件每行的内容比较复杂的话就必须对这段代码进行改写,但只要知道了处理的关键技巧,剩下的问题都不难解决。

另外一篇来自苏蓉蓉的用 awk 来实现洗牌效果的随机文件排序代码分析(原贴在这里,以及对此帖的一个后续讨论,如果你没有登录帐号的话可以到这里查看精华区文章)则写的更为详细:
--------------------------------------------------------------------
关于洗牌问题,其实已经有了一个很好的shell解法,这里另外给三个基于AWK的方法,有错误之处还请不吝指出。

方法一:穷举

类似于穷举法,构造一个散列来记录已经打印行出现行的次数,如果出现次数多于一次则不进行处理,这样可以防止重复,但缺点是加大了系统的开销。

代码如下:

awk -v N=`sed -n '$=' data` '
BEGIN{
FS="\n";
RS=""
}
{
srand();
while(t!=N){
  x=int(N*rand()+1);
  a[x]++;
  if(a[x]==1)
    {
        print $x;t++
    }
  }
}
' data


方法二:变换

基于数组下标变换的办法,即用数组储存每行的内容,通过数组下标的变换交换数组的内容,效率好于方法一。

代码如下:


#! /usr/awk

BEGIN{
srand();
}

{
b[NR]=$0;
}

END{

C(b,NR);
for(x in b)
  {
    print b[x];
  }}

function C(arr,len,i,j,t,x){

for(x in arr)
  {
      i=int(len*rand())+1;
      j=int(len*rand())+1;
      t=arr[i];
      arr[i]=arr[j];
      arr[j]=t;
  }

}

方法三:散列

    三个方法中最好的。
    利用AWK中散列的特性(详细请看:info gawk 中的7.x ),只要构造一个随机不重复的散列函数即可,因为一个文件每行的linenumber是独一无二的,所以用:

    随机数+每行linenumber    ------对应------>    那一行的内容

    即为所构造的随机函数。
    从而有:

代码如下:

awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data

    其实大家担心的使用内存过大的问题不必太在意,可以做一个测试

测试环境:

PM 1.4GHz CPU,40G硬盘,内存256M的LAPTOP
SUSE 9.3  GNU bash version 3.00.16 GNU Awk 3.1.4

产生一个五十几万行的随机文件,大约有38M:

代码如下:

od /dev/urandom |dd  count=75000 >data


拿效率较低的方法一来说:

洗牌一次所用时间:

代码如下:

time awk -v N=`sed -n '$=' data` '
BEGIN{
FS="\n";
RS=""
}
{
srand();
while(t!=N){
  x=int(N*rand()+1);
  a[x]++;
  if(a[x]==1)
    {
        print $x;t++
    }
  }
}
' data


结果(文件内容省略):

代码如下:

real    3m41.864s
user    0m34.224s
sys     0m2.102s


所以效率还是勉强可以接受的。

方法二的测试:

代码如下:


time awk -f awkfile datafile


结果(文件内容省略):

代码如下:

real    2m26.487s
user    0m7.044s
sys     0m1.371s


效率明显好于第一个。

接着考察一下方法三的效率:

代码如下:

time awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data


结果(文件内容省略):

代码如下:

real    0m49.195s
user    0m5.318s
sys     0m1.301s


对于一个38M的文件来说已经相当不错了。
--------------------------------------------------------------------

附带存一个来自 flyfly 写的 python 版本乱序代码:

代码如下:


#coding:gb2312
import sys
import random

def usage():
print "usage:program srcfilename dstfilename"
global filename
filename = ""
try:
filename = sys.argv[1]
except:
usage()
raise()
#open the phonebook file

f = open(filename, 'r')
phonebook = f.readlines()
print phonebook
f.close()

#write to file randomly
try:
filename = sys.argv[2]
except:
usage()
raise()

f = open(filename, 'w')
random.shuffle(phonebook)
f.writelines(phonebook)
f.close()

到此,相信大家对“有哪些用Shell脚本实现乱序排列文件内容的方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 有哪些用Shell脚本实现乱序排列文件内容的方法

本文链接: https://www.lsjlt.com/news/257212.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 有哪些用Shell脚本实现乱序排列文件内容的方法
    本篇内容主要讲解“有哪些用Shell脚本实现乱序排列文件内容的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些用Shell脚本实现乱序排列文件内容的方法”吧!洗牌问题:洗一副扑克,有什么...
    99+
    2023-06-09
  • 有哪些Shell脚本统计文件行数的方法
    这篇文章主要讲解了“有哪些Shell脚本统计文件行数的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Shell脚本统计文件行数的方法”吧!获取单个文件行数文件:test1.sh行数...
    99+
    2023-06-09
  • 怎么用Shell脚本实现批量替换文件内容
    这篇文章主要讲解了“怎么用Shell脚本实现批量替换文件内容”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Shell脚本实现批量替换文件内容”吧!系统:centos 5.x1.先确认有...
    99+
    2023-06-09
  • Shell脚本一次读取文件中一行的方法有哪些
    这篇文章主要讲解了“Shell脚本一次读取文件中一行的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Shell脚本一次读取文件中一行的方法有哪些”吧!写法一:代码如下:#!/bin...
    99+
    2023-06-09
  • shell脚本中echo实现显示内容带颜色的方法
    这篇文章主要讲解了“shell脚本中echo实现显示内容带颜色的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell脚本中echo实现显示内容带颜色的方法”吧!shell脚本中ech...
    99+
    2023-06-09
  • Shell中调用、引用、包含另一个脚本文件的方法有哪些
    本篇内容介绍了“Shell中调用、引用、包含另一个脚本文件的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!脚本 first (测试...
    99+
    2023-06-09
  • Shell脚本读取ini配置文件的实现方法
    本篇内容介绍了“Shell脚本读取ini配置文件的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单版参考stackoverfl...
    99+
    2023-06-09
  • jquery添加文本内容的方法有哪些
    jQuery添加文本内容的方法有以下几种:1. .text()方法:设置或返回所选元素的文本内容。例如:`$("p").text("新的文本内容");`2. .html()方法:设置或返回所选元素的HTML内容。例如:`$("p").h...
    99+
    2023-08-09
    jQuery
  • python读取文本内容的方法有哪些
    在Python中,读取文本内容的方法有以下几种: 使用open()函数打开文件并读取内容: with open('fi...
    99+
    2024-04-02
  • python运行脚本文件的方法有哪些
    本篇内容介绍了“python运行脚本文件的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!python脚本执行的3种方法:(找到自己...
    99+
    2023-07-02
  • java修改文件内容的方法有哪些
    Java 修改文件内容的方法有以下几种:1. 使用FileWriter和BufferedWriter类:通过创建FileWriter...
    99+
    2023-08-29
    java
  • golang读取文件内容的方法有哪些
    在 Golang 中,我们可以使用以下几种方法来读取文件的内容: 使用 ioutil 包中的 ReadFile 函数:使用 iou...
    99+
    2023-10-20
    golang
  • php写入文件内容的方法有哪些
    在PHP中,可以使用以下方法来写入文件内容:1. 使用`file_put_contents()`函数:该函数将一个字符串写入文件中。如果文件不存在,则创建新文件。如果文件已存在,则覆盖文件内容。示例代码如下:```php$file = ...
    99+
    2023-08-11
    php
  • php读取文件内容的方法有哪些
    PHP读取文件内容的方法有以下几种:1. file_get_contents():该函数用于将整个文件内容读取到一个字符串中。可以接...
    99+
    2023-09-26
    php
  • go序列化的实现方法有哪些
    Go语言中序列化的实现方法有以下几种: 使用标准库的encoding/json包进行JSON序列化和反序列化。 使用标准库的enc...
    99+
    2024-02-29
    go
  • python清除html文件中内容的方法有哪些
    这篇文章给大家分享的是有关python清除html文件中内容的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python清除html文件中内容的方法:1、使用join方法,代码为【pat = re.co...
    99+
    2023-06-06
  • BAT脚本批量修改文件名的方法有哪些
    本文小编为大家详细介绍“BAT脚本批量修改文件名的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“BAT脚本批量修改文件名的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过BAT脚本批量修改...
    99+
    2023-06-30
  • shell中的数组操作小结和冒泡排序实现脚本的方法教程
    本篇内容主要讲解“shell中的数组操作小结和冒泡排序实现脚本的方法教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“shell中的数组操作小结和冒泡排序实现脚本的方法教程”吧!shell数组介...
    99+
    2023-06-09
  • 实用的SQL Server脚本函数方法有哪些
    这篇文章主要讲解了“实用的SQL Server脚本函数方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“实用的SQL Server脚本函数方法有哪些”...
    99+
    2024-04-02
  • JS实现数组随机排序的方法有哪些
    本篇内容介绍了“JS实现数组随机排序的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.利用数组方法sort实现随机排序实现随机排...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作