免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3898 | 回复: 10
打印 上一主题 下一主题

请教:用sed实现文件分割功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-10 14:37 |只看该作者 |倒序浏览
有file文本文件,如何将1-5行内容写到文件 fhead,将末尾两行内容写到文件 ftail,其余的中间部分写到文件 fbody。用 sed 为主的 shell 如何实现?
谢谢!

论坛徽章:
0
2 [报告]
发表于 2005-05-10 16:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-05-10 22:20 |只看该作者

请教:用sed实现文件分割功能


  1. n=$(cat tmp|wc -l)
  2. awk 'NR<=5{print >"a.txt"};NR>5&&NR<'"$n"'-1{print >"b.txt"};NR>='"$n"'{print >"c.txt"}'
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-05-11 07:08 |只看该作者

请教:用sed实现文件分割功能

我对AWK不熟悉,曾经用了许多条SED命令实现:
flt=`cat file |wc -l |sed 's/ //g`   #取文件总行数
fls=`expr $flt - 1`     #取倒数第二行的行号
sed -n '1,5p' file >fhead   
sed -n '${fls},${flt}p' file >ftail
sed '${fls},${flt}d 1,5d' <file >fbody    #(具体格式记不清楚了)
但觉得太繁琐,请问,有无更简单的方法?

论坛徽章:
0
5 [报告]
发表于 2005-05-11 09:53 |只看该作者

请教:用sed实现文件分割功能

取文件总行数
flt=`cat file | wc -l`不可以吗?为什么后面还要加sed s'/ //g'呢?

论坛徽章:
0
6 [报告]
发表于 2005-05-11 10:54 |只看该作者

请教:用sed实现文件分割功能

sed -n '${fls},${flt}p' file >ftail

变量 ${fls} ${flt} 不能用呢?

论坛徽章:
0
7 [报告]
发表于 2005-05-11 11:22 |只看该作者

请教:用sed实现文件分割功能

回 bst:
应当是
sed -n "${fls},${flt}p" ...
经测试,应当用双引号。

论坛徽章:
0
8 [报告]
发表于 2005-05-11 11:27 |只看该作者

请教:用sed实现文件分割功能

回 fish617:
去掉前面的空格。

论坛徽章:
0
9 [报告]
发表于 2005-05-11 14:54 |只看该作者

请教:用sed实现文件分割功能

终于改好一些了:
t1=`cat file |wc -l|sed 's/ //g'`
t2=`expr $t1 - 1`

sed -n "1,5w t.head
${t2},${t1}w t.tail

${t2},${t1}d
1,5d
w t.body
" <file

但还是觉得有一些繁琐,不知各位有无更好的方案,更简练一些。

论坛徽章:
0
10 [报告]
发表于 2005-05-11 17:07 |只看该作者

请教:用sed实现文件分割功能

试试这个:
$cat filename
1 #include <sys/types.h>
2 #include <unistd.h>
3
4 int main(int argc, char **argv)
5 {
6    char ch = 0;
7
8    while (read(0, &ch, 1) == 1) {
9        if (ch < 0) {
10            if (read(0, &ch, 1) != 1)
11               break;
12            continue;
13        }
14        write(1, &ch, 1);
15    }
16    return 0;
17 }

程序如下:

nawk '{ line[NR] = $0 }
END { for(i = 1; i <= NR; i++){
        if(i < 6)
            print line > "fhead"
        if(i >= 6 && i <= NR - 2)
            print line > "fbody"
        if( i > NR - 2)
            print line > "ftail" }
}' filename

运行结果:

$cat fhead
1 #include <sys/types.h>
2 #include <unistd.h>
3
4 int main(int argc, char **argv)
5 {

$cat fbody
6    char ch = 0;
7
8    while (read(0, &ch, 1) == 1) {
9        if (ch < 0) {
10            if (read(0, &ch, 1) != 1)
11               break;
12            continue;
13        }
14        write(1, &ch, 1);
15    }

$cat ftail
16    return 0;
17 }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP