博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文件按行随机排列
阅读量:4463 次
发布时间:2019-06-08

本文共 2692 字,大约阅读时间需要 8 分钟。

今天碰到了个需求,就是我需要在一个文件里随机抽一些行出来做训练集,剩下的做测试集。因为原来的文件排列有一定的顺序可能影响结果,所以不能直接head或者tail。我以为肯定有个命令很方便的完成这件事情,结果搜了半天没搜到可以直接用的(可能还是有,只是我太蠢没有找到。。。),结果发现了一个博客是用c结合shell做的,感觉还挺不错。思路就是用c把文件每行的尾部加上一个随机数(各行后面的随机数不重复),之后再用shell按最后一列排序就好。

原文在这里:http://blog.csdn.net/liyuxia713/article/details/7445592

备份下代码在下面:

//random.c#include 
#include
#include
#include
using namespace std;const int LEN = 4098;//返回属于[p,q)的随机整数 int rand(int p, int q){ int size = q-p+1; return p+ rand()%size;}//交换两个元素值 void swap(int& a , int& b){ int temp = a; a = b; b = temp;}//打印数组值void print(int *v, int n){ for(int i=0; i < n ; i++) { printf("%u\n", v[i]); }} //给数组a[n], 随机不重复赋值[1,n]之间的数void randomize(int *v, int n){ //initialize for(int i=0; i < n; i++) { v[i] = i+1; } for(int i=n-1; i>0; i--) { int r = rand(0,i+1); swap(v[r], v[i]); }}//删除换行符int chomp(char *str){ int len = strlen(str); while(len > 0 && (str[len - 1] == '\n' || str[len - 1] == '\r')) { str[len - 1] = 0; len--; } return len;}//主函数int main(int argc, char *argv[]){ int line_num = atoi(argv[1]); printf("%u\n",line_num); int *value = (int*)malloc((line_num) * sizeof(int)); printf("%u\n",line_num); randomize(value, line_num); //print(value, N); FILE* infile = fopen(argv[2], "r"); if( infile == NULL ) { printf("Cann't open file %s.", argv[1]); return 0; } FILE* outfile = fopen(argv[3], "w"); if( outfile == NULL) { printf("Cann't open file %s to write.", argv[2]); return 0; } int i=0; char str[LEN]; str[0] = 0; str[LEN-1] = 0; while( !feof(infile) ) { if( !fgets(str, sizeof(str),infile)) { break; } str[LEN- 1] = 0; chomp(str); fprintf(outfile, "%s\t%u\n", str, value[i]); i++; } fclose(infile); fclose(outfile); return 0;}
#!/bin/sh### note: sh random.sh in_fname out_fname  ###infile=$1outfile=$2line_num=`cat $infile | wc -l `./random $line_num $infile $outfile.tmpsort $outfile.tmp -k 2 -n -t '  ' | cut -f1  > $outfile

 

恩补充一下sort:

-n表示按数值排序

-k是第几列(从1计数)

-t指定分割符 (如果在命令行里tab可以用ctrl+v+i)

 

 

 

转载于:https://www.cnblogs.com/parapax/p/3647007.html

你可能感兴趣的文章
C++ Primer 第六章 函数
查看>>
交互设计算法基础(3) - Quick Sort
查看>>
Ubuntu各种软件的安装
查看>>
Android电源管理
查看>>
C#_基础_方法以及方法重载(十)
查看>>
新起点新希望
查看>>
LINQ系列:LINQ to DataSet的DataTable操作
查看>>
ASP。net 测验
查看>>
java开发环境搭建-慕课网
查看>>
NOIP2015-D2T3运输计划
查看>>
Z :彻底了解指针数组,数组指针以及函数指针 [复
查看>>
2013年终总结
查看>>
Start to study Introduction to Algorithms
查看>>
AE常见接口之间的关系(较笼统)+arcgis常见概念
查看>>
正则表达式
查看>>
三元操作设计不同类型的时候,最终结果的问题
查看>>
POJ 1661 Help Jimmy LIS DP
查看>>
大数据时代,我诚惶诚恐的拥抱
查看>>
c++小游戏——五子棋
查看>>
浏览器全屏非全屏切换
查看>>