返回列表 发帖
回复 6# 愤怒的CMD


    gawk 可以像这样:
  1. gawk -v count=300 "{N=FNR-1;print>int(N/count+1) \".txt\"}" 测试.txt
复制代码
1

评分人数

TOP

回复 9# yiwuyun


    sed 不支持变量,所以无法完全靠 sed 实现,这里给个例子,最大支持 30000 行:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in (1 1 100) do (
  3. set /a n=%%a*300
  4. echo !n!,~300w %%a.txt
  5. ))>sed.script
  6. sed -n -f sed.script 测试.txt
复制代码

TOP

回复 12# yiwuyun


    awk 可算是 perl 他爹啊,必须强大。
    sed 的强大在于用简短而晦涩的指令高度概括最经常用到的行操作,在 shell 里用起来爽爆,简直可以盲打。
    但简短快速的同时也失去了对更精细功能的支持,这就是为什么在 sed 里最强大的用法几乎都是倒腾正则和那两个空间,而在 awk 里貌似没有哪个东西是缺了它就不行的
    个人见解,如有偏颇欢迎指正

TOP

也可以用 gnu 命令 split:
  1. @echo off
  2. split -l 300 a.txt splittxt_
  3. (for /l %%a in (1 1 1000) do ren splittxt_* %%a.txt) 2>nul
  4. pause
复制代码

TOP

回复 16# yiwuyun


奇思妙想,nice!

那个多余的 p 可以这样去掉:
  1. sed -n "=" a.txt|sed -n "1~6H;${g;p}"
复制代码
或者这样:
  1. sed -n "=" a.txt|sed -n "${p;q};1~6p"
复制代码

TOP

回复 16# yiwuyun


借兄台代码,改写成这样就没问题了,思路不变:
  1. sed -n "$=;$q;0~6=;1~6=" a.txt|sed -nr "N;s/\n(.*)/,\1w/;p"|sed -n "p;="|sed -r "N;s/\n(.*)$/\1.txt/"|sed -nf - a.txt
复制代码
这个思路下还能继续简化吗...

TOP

回复 19# yiwuyun


感谢提醒,不过你想复杂了,其实 sed 的 N 在碰到 $ 时,会阻止后面的指令,所以行数若为奇数行,最后一行是不会被输出的
简单把
  1. sed -n "$=;$q;0~6=;1~6="
复制代码
改成
  1. sed -n "${=;=;q};0~6=;1~6="
复制代码
就可以了

完整的就是
  1. sed -n "${=;=;q};0~6=;1~6=" a.txt|sed -nr "N;s/\n(.*)/,\1w/;p"|sed -n "p;="|sed -r "N;s/\n(.*)$/\1.txt/"|sed -nf - a.txt
复制代码

TOP

回复 21# terse


    也是,哎呀好暴力

TOP

返回列表