Csv awk分解为随机子集

Csv awk分解为随机子集,csv,random,awk,Csv,Random,Awk,我有一个包含500k行的CSV文件,我需要将其分为两组,分别为400k和100k。但是,我无法执行类似于awk'NR“第一个”打印>“第二个”#将标题写入两个文件 下一条#跳到下一条记录 } { 在awk中打印>(rand()。首先是一些示例文件: $ seq 1 100 > file 然后脚本: $ awk '{print > (rand()<=0.2?"first":"second")}' file :警告:在大多数awk实现中,包括gawk,每次运行awk时,rand

我有一个包含500k行的CSV文件,我需要将其分为两组,分别为400k和100k。但是,我无法执行类似于
awk'NR<100000'file.csv>subset1.csv
的操作,因为行已排序,我需要随机分布。
我如何将这两组数据随机化?作为补充说明,尺寸不必精确,

i、 e.
398111
101889
也将是可接受的分割,如果在awk中无法实现完美分割。另外,我需要在awk中的两个输出文件中都包含标题行。首先是一些示例文件:

split -l 400000 <(shuf file.csv)
$ seq 1 100 > file
然后脚本:

$ awk '{print > (rand()<=0.2?"first":"second")}' file
警告:在大多数awk实现中,包括gawk,每次运行awk时,rand()都会从相同的起始编号或种子生成编号--如果希望程序每次使用时都执行不同的操作,则必须将种子更改为每次运行时都不同的值。为此,请使用srand()。您可能需要将
BEGIN{srand()}
添加到脚本中

编辑:将所有内容收集到一个脚本中:

awk '
BEGIN {
    srand()                                # change the random seed 
}
NR==1 {
    print > "first"; print > "second"      # write the header to both files
    next                                   # skip to next record
}
{
    print > (rand()<=0.2?"first":"second") # print about every fifth record to first file
}' file
awk'
开始{
srand()#更改随机种子
}
NR==1{
打印>“第一个”打印>“第二个”#将标题写入两个文件
下一条#跳到下一条记录
}
{

在awk中打印>(rand()。首先是一些示例文件:

$ seq 1 100 > file
然后脚本:

$ awk '{print > (rand()<=0.2?"first":"second")}' file
警告:在大多数awk实现中,包括gawk,每次运行awk时,rand()都会从相同的起始编号或seed开始生成编号--如果希望程序每次使用时执行不同的操作,则必须在每次运行时将seed更改为不同的值。为此,请使用srand().Ie。您可能需要将
开始{srand()}
添加到脚本中

编辑:将所有内容收集到一个脚本中:

awk '
BEGIN {
    srand()                                # change the random seed 
}
NR==1 {
    print > "first"; print > "second"      # write the header to both files
    next                                   # skip to next record
}
{
    print > (rand()<=0.2?"first":"second") # print about every fifth record to first file
}' file
awk'
开始{
srand()#更改随机种子
}
NR==1{
打印>“第一个”打印>“第二个”#将标题写入两个文件
下一条#跳到下一条记录
}
{

打印>(兰德()您可以使用
shuf
对文件进行随机化,然后使用
split-l
…您可以使用
shuf
对文件进行随机化,然后使用
split-l
…两个被拆分的文件都没有保留原始文件的标题行,猜测它也被洗牌了。我是否可以以某种方式将其排除,然后再将其添加到新文件中?@AlexH您可以在shuf和split之前剪切标题行。稍后将标题添加到拆分文件。两个拆分文件都没有保留我原始文件的标题行,猜测它也被洗牌。我是否可以以某种方式排除它,然后再将其添加到新文件中?@AlexH您可以在shuf和split之前剪切标题行。稍后添加标题to分割文件。看起来像我正在寻找的,但我还需要在两个输出文件中包含标题行。添加以下内容:
NR==1{print>“first”;print>“second”;next}
在另一个
打印
块之前。它将第一条记录打印到两个文件中,并跳过处理下一条记录,运行完整的脚本,但总行数从519223增加到519225,增加了2行。由于头行重复,我本来只希望得到一行额外的行。是的,我也是。t中的任何一行文件有两个标题?另外,你确定在原始文件的最后一行之后有一个换行符吗?注意,这实际上是将排序的行写入随机(两个)文件。如果输入已排序,则结果文件仍会排序。它们不是随机分布的。看起来像我要查找的,但我还需要在两个输出文件中包含标题行。添加以下内容:
NR==1{print>“first”;print>“second”;next}
在另一个
打印
块之前。它将第一条记录打印到两个文件中,并跳过处理下一条记录,运行完整的脚本,但总行数从519223增加到519225,增加了2行。由于头行重复,我本来只希望得到一行额外的行。是的,我也是。t中的任何一行文件有两个标题?另外,你确定在原始文件的最后一行之后有一个换行符吗?注意,这实际上会将已排序的行写入随机(两)文件。如果输入已排序,则结果文件仍会排序。它们不是随机分布的。