You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从行对齐平行语料库中一致抽取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行(避免样本偏差),关键是要让两个文件的随机行完全对应,这里分两步走:

  1. 先生成一组不重复的随机行号(假设你的文件总行数是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
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:40:09