如何按多行交替模式将多行列文件分割为两个输出文件?
按每n行交替分割文件到两个输出文件的解决方案
我来分享几个简单好用的方法,帮你实现把输入文件按每n行一组,交替存入out1和out2的需求,完全匹配你给出的示例场景。
方法1:用awk(最简洁高效)
awk处理这类文本分割需求简直是神器,一行命令就能搞定。比如当你需要n=2时,直接运行:
awk -v n=2 'NR%(2*n) <=n {print > "out1"; next} {print > "out2"}' file
逻辑解释:
-v n=2:把分组行数n传递给awk脚本,你可以根据需要改成任意数字(比如n=3就改成-v n=3)NR是awk内置的当前行号变量,NR%(2*n)计算行号除以2n的余数- 如果余数≤n,说明这行属于第1、3、5...组,写入out1
- 否则属于第2、4、6...组,写入out2
用你给出的示例文件测试,运行后out1会包含前两行和最后两行,out2包含中间两行,完全符合预期。
方法2:用基础shell命令(适合不熟悉awk的情况)
如果对awk不太熟悉,用split+循环的组合也能实现,步骤更直观:
# 设置分组行数n n=2 # 先清空输出文件(避免追加旧内容) > out1 > out2 # 把输入文件分割成每个n行的临时文件,前缀为temp_part_ split -l "$n" file temp_part_ # 循环处理每个临时文件,交替合并到out1和out2 i=1 for part in temp_part_*; do if (( i % 2 == 1 )); then cat "$part" >> out1 else cat "$part" >> out2 fi ((i++)) # 删除临时文件 rm "$part" done
逻辑解释:
split -l n:把file分割成多个小文件,每个文件刚好n行- 循环遍历这些小文件,奇数序号的文件合并到out1,偶数序号的合并到out2
- 最后清理临时文件,避免占用空间
内容的提问来源于stack exchange,提问作者Michael Gruenstaeudl
相关产品推荐
相关产品推荐

