Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从两个文本文件(平行语料库)中随机抽取N行,并保持一致_Linux_Bash_Shell_File_Command Line - Fatal编程技术网

Linux 从两个文本文件(平行语料库)中随机抽取N行,并保持一致

Linux 从两个文本文件(平行语料库)中随机抽取N行,并保持一致,linux,bash,shell,file,command-line,Linux,Bash,Shell,File,Command Line,一次又一次,我面临着从两个文件(即平行语料库)中抽取特定数量行的问题,比如N行;句子按照行号一致地对齐 这是任何研究神经机器翻译的人常见和频繁的任务。 我想知道一种快速有效的采样方法,即从并行语料库中选择N行,可能是从命令行中选择 例如,如果我们希望以一致的方式从两个文件中选择4行,我们可以在行号3、12、17、23处采样行。这应该给我们两个文件中的这些行。另外,最好将这个参数N设置为任意的,这样我们就可以随意更改它。此外,应在不重复的情况下对这些线进行采样。并且,需要采样的所需行数N将始终小于

一次又一次,我面临着从两个文件(即平行语料库)中抽取特定数量行的问题,比如N行;句子按照行号一致地对齐

<>这是任何研究神经机器翻译的人常见和频繁的任务。

我想知道一种快速有效的采样方法,即从并行语料库中选择N行,可能是从命令行中选择

例如,如果我们希望以一致的方式从两个文件中选择4行,我们可以在行号3、12、17、23处采样行。这应该给我们两个文件中的这些行。另外,最好将这个参数N设置为任意的,这样我们就可以随意更改它。此外,应在不重复的情况下对这些线进行采样。并且,需要采样的所需行数N将始终小于两个文件中的总行数,其中两个文件的总行数始终相等

一旦我们对所需的行进行采样,还需要从两个文件中获取尚未采样的行,即获取在随机采样中未选择的其余行

这样做的整个想法是以一致的方式对两个文件进行采样,以便保留它们的行对齐。i、 e.选择N条线和N-T条线,其中T是线的总数

其中,N是不重复采样的所需行数,N-T是未采样的其余行数


我该怎么做呢?提前谢谢

如果不允许重复,最好使用洗牌算法。已经有一个用于此目的的工具shuf

比如说,

$ shuf -n 10 file
将以随机顺序从文件中随机选择10行。您的请求还有两个附加约束,第一个约束是对所选内容进行排序,第二个约束是在下次运行时所选内容必须保持一致。对于第二个需求,您可以向shuf提供随机性源,以两次获得相同的序列。为了分类,我们只能靠自己

$ shuf -n 10 --random-source=file <(cat -n file1) | sort -n | cut -f2- > sample1
$ shuf -n 10 --random-source=file <(cat -n file2) | sort -n | cut -f2- > sample2
要获取未选定的行,需要保留行号。使用第二种选择

$ paste -d'|' file1 file2 | cat -n | shuf -n 10 | sort -n > n_samples
$ cut -f2- n_samples > samples
$ awk 'NR==FNR{a[$1];next} !(FNR in a)' <(cut -f1 n_samples) samples > notselected
您可以像以前一样拆分示例文件和非选定文件

使用第一种方法,文件中未选择的行将写入具有相同名称和扩展名的文件。而不是

$ cat -n file1 | shuf -n 10 --random-source=file | sort -n > n_sample1
$ cut -f2- n_sample1 > sample1
$ cat -n file2 | shuf -n 10 --random-source=file | sort -n | cut -f2- > sample2
$ awk 'NR==FNR    {a[$1];next} 
      !(FNR in a) {print > FILENAME".not"}' <(cut -f1 n_sample1) sample1 sample2 

如果不允许重复,最好使用洗牌算法。已经有一个用于此目的的工具shuf

比如说,

$ shuf -n 10 file
将以随机顺序从文件中随机选择10行。您的请求还有两个附加约束,第一个约束是对所选内容进行排序,第二个约束是在下次运行时所选内容必须保持一致。对于第二个需求,您可以向shuf提供随机性源,以两次获得相同的序列。为了分类,我们只能靠自己

$ shuf -n 10 --random-source=file <(cat -n file1) | sort -n | cut -f2- > sample1
$ shuf -n 10 --random-source=file <(cat -n file2) | sort -n | cut -f2- > sample2
要获取未选定的行,需要保留行号。使用第二种选择

$ paste -d'|' file1 file2 | cat -n | shuf -n 10 | sort -n > n_samples
$ cut -f2- n_samples > samples
$ awk 'NR==FNR{a[$1];next} !(FNR in a)' <(cut -f1 n_samples) samples > notselected
您可以像以前一样拆分示例文件和非选定文件

使用第一种方法,文件中未选择的行将写入具有相同名称和扩展名的文件。而不是

$ cat -n file1 | shuf -n 10 --random-source=file | sort -n > n_sample1
$ cut -f2- n_sample1 > sample1
$ cat -n file2 | shuf -n 10 --random-source=file | sort -n | cut -f2- > sample2
$ awk 'NR==FNR    {a[$1];next} 
      !(FNR in a) {print > FILENAME".not"}' <(cut -f1 n_sample1) sample1 sample2 
参数$1,2,3:样本数、文件名1和2。 使用wc-l和cat的maxline,因为这样我们就不需要删除文件名了。没有无用的使用猫奖,在这里。 seq x y生成一个从x到y的序列,这里是1到maxlines。由于源wc从1开始计数,因此没有一个off by one错误。 shuf-e将数字洗牌,而-e不希望它们按行排列 对于采样计数,请从前面拉出线号, 但是对它们进行排序,这样sed只需遍历文件一次。 后缀“p”表示sed。 sed-n,对于一个11行的小文件,sample=4,如下所示:

sed-n3p 4p 5p 7p mul.sh

如果您不希望以文件方式输出,而是以行方式输出,请将其收集到阵列中:

rows1=($(sed -n "$lines" "$file1"))
rows2=($(sed -n "$lines" "$file2"))
这样,sed仍然只需遍历一次可能较大的文件。使用从0到$sample-1的数组索引,您可以迭代两行数组并比较它们——或者不管作业是什么

参数$1,2,3:样本数、文件名1和2。 使用wc-l和cat的maxline,因为这样我们就不需要删除文件名了。没有无用的使用猫奖,在这里。 seq x y生成一个从x到y的序列,这里是1到maxlines。由于源wc从1开始计数,因此没有一个off by one错误。 shuf-e将数字洗牌,而-e不希望它们按行排列 对于采样计数,请从前面拉出线号, 但是对它们进行排序,这样sed只需遍历文件一次。 后缀“p”表示sed。 sed-n,对于一个11行的小文件,sample=4,如下所示:

sed-n3p 4p 5p 7p mul.sh

如果您不希望以文件方式输出,而是以行方式输出,请将其收集到阵列中:

rows1=($(sed -n "$lines" "$file1"))
rows2=($(sed -n "$lines" "$file2"))
这样的话,塞德还得穿过可能很大的地方
e文件只有一次。使用从0到$sample-1的数组索引,您可以在两行数组上迭代并比较它们,或者不管作业是什么。

重复还是不重复?同一行可以多次采样。另外,文件行大小大于N?@karakfa,无重复!需要采样的所需行数N将始终小于两个文件中的总行数:。此外,两个文件的行数相同。谢谢重复还是不重复?同一行可以多次采样。另外,文件行大小大于N?@karakfa,无重复!需要采样的所需行数N将始终小于两个文件中的总行数:。此外,两个文件的行数相同。谢谢谢谢是否有一种简单的方法也可以从两个未采样的文件中获取行?i、 e.获取随机抽样中未选择的其余行。谢谢!我发现第一种方法比第二种更直接。使用第一种方法不可能得到未选择的线吗?是的,做同样的事情;在sort-n之后保存行编号样本,并提取行号,如图所示。您只需要这一次,因为两个行号都是相同的。为了完整起见,您介意在答案中也添加这一点吗已更新,但再次未测试。请在这里验证和评论。谢谢!是否有一种简单的方法也可以从两个未采样的文件中获取行?i、 e.获取随机抽样中未选择的其余行。谢谢!我发现第一种方法比第二种更直接。使用第一种方法不可能得到未选择的线吗?是的,做同样的事情;在sort-n之后保存行编号样本,并提取行号,如图所示。您只需要这一次,因为两个行号都是相同的。为了完整起见,您介意在答案中也添加这一点吗已更新,但再次未测试。请在这里核实和评论。