如何从行对齐平行语料库中一致抽取N行?求高效命令行方案
嘿,这个需求在神经机器翻译的日常实验里简直是高频操作!我给你整理了几个实用的命令行方案,都是我平时干活常用的,保证高效还能严格对齐行号:
方案1:抽取前N行(最简单直接)
如果只是需要取文件开头的N行(比如你说的4行),head命令就是最优解,完全不需要担心对齐问题:
- 假设你的源文件是
src.txt,目标文件是tgt.txt,执行以下命令:
# 抽取src.txt的前4行到新文件 head -n 4 src.txt > src_sample.txt # 抽取tgt.txt的前4行到新文件 head -n 4 tgt.txt > tgt_sample.txt
方案2:抽取指定行范围(比如第X到第Y行)
如果需要的不是开头,而是中间某一段连续的行(比如第5到第8行,刚好4行),用sed命令精准定位:
# 打印src.txt第5到8行,输出到样本文件 sed -n '5,8p' src.txt > src_sample.txt # 对tgt.txt执行同样的行范围抽取 sed -n '5,8p' tgt.txt > tgt_sample.txt
这里的-n参数是让sed只输出我们指定的行,'5,8p'表示“打印第5到第8行”,完美保证两行文件的行号对齐。
方案3:随机抽取N行(适合做随机验证集)
如果需要随机抽取N行(避免样本偏差),关键是要让两个文件的随机行完全对应,这里分两步走:
- 先生成一组不重复的随机行号(假设你的文件总行数是1000):
# 生成1-1000之间的4个随机行号,保存到临时文件 shuf -i 1-1000 -n 4 > random_lines.txt
如果不知道总行数,可以用wc -l自动获取:
# 先获取源文件的总行数 total_lines=$(wc -l < src.txt) # 生成对应范围的随机行号 shuf -i 1-$total_lines -n 4 > random_lines.txt
- 用
awk根据随机行号抽取对应内容:
# 从src.txt中抽取随机行号对应的行 awk 'NR==FNR{lines[$0]=1; next} FNR in lines' random_lines.txt src.txt > src_sample.txt # 对tgt.txt执行同样的抽取逻辑 awk 'NR==FNR{lines[$0]=1; next} FNR in lines' random_lines.txt tgt.txt > tgt_sample.txt
解释一下这个awk命令:
NR==FNR是awk的经典写法,用来处理第一个输入文件(这里是random_lines.txt),把行号存入lines数组;- 处理第二个文件时,判断当前行号
FNR是否在lines数组里,是的话就打印该行,这样两个文件的随机行就严格对齐了。
小技巧:写个复用脚本
如果经常需要做这个操作,可以写个简单的bash函数,避免重复敲命令:
# 定义一个抽取平行语料的函数 extract_parallel() { local sample_num=$1 local src_file=$2 local tgt_file=$3 # 生成带sample后缀的输出文件名 local src_out="${src_file%.txt}_sample.txt" local tgt_out="${tgt_file%.txt}_sample.txt" # 执行抽取 head -n $sample_num $src_file > $src_out head -n $sample_num $tgt_file > $tgt_out echo "已完成抽取,样本文件:$src_out 和 $tgt_out" }
用的时候直接在终端输入:
extract_parallel 4 src.txt tgt.txt
一键搞定!
内容的提问来源于stack exchange,提问作者kmario23
相关产品推荐
相关产品推荐

