免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: metaxing
打印 上一主题 下一主题

如何删除首行和分裂文本文件 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-11-29 09:48 |只看该作者
原帖由 hulnglei 于 2009-11-28 23:49 发表
一定要用perl吗?    如果只有15个文件的话直接用awk,head 等其他命令很简单吧!
head -n 255 input.csv > output.csv


尝试使用windows下的gawk来进行删除首行处理,语句如下:
gawk.exe -F";" "BEGIN {OFS=";"} NR>1 {print}" Adjacency.csv >Adjacency.txt
设置简化为:
gawk.exe -F";" "NR>1{print}" Adjacency1.csv > Adjacency.txt

但是执行结果为空,命令行提示如下:
E:\>gawk.exe   -F";" "NR>1{print}" Adjacency.csv  1>Adjacency.txt

GAWK: fatal error: cannot open file Adjacency.csv for reading (No such file or directory)

显示找不到Adjacency.csv这个文件,且输出符>前多了一个1.
请问何错,请指教!

[ 本帖最后由 metaxing 于 2009-11-29 10:09 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2009-11-29 10:44 |只看该作者
原帖由 metaxing 于 2009-11-29 09:48 发表


尝试使用windows下的gawk来进行删除首行处理,语句如下:
gawk.exe -F";" "BEGIN {OFS=";"} NR>1 {print}" Adjacency.csv >Adjacency.txt
设置简化为:
gawk.exe -F";" "NR>1{print}" Adjacency1.csv > Adj ...


这个我还真不知道 awk我只在linux下的系统用过,我的windows没有装awk
linux下删除首行的命令是:
awk -F";" 'NR>1{print}' Adjacency.csv >Adjacency.txt 尽供参考。

至于删除左255列,我上次试过,列数还没超过20,用awk就开始出错,而且我基本肯定是awk的问题,所以你最好尝试其他方式
嘿嘿!列数如果少的话$1,$2,$3慢慢写也行啊!可惜这么多

论坛徽章:
0
13 [报告]
发表于 2009-11-29 11:26 |只看该作者
用in-place editing很容易解决,看看6楼给的例子

论坛徽章:
0
14 [报告]
发表于 2009-11-29 14:33 |只看该作者
嗯,努力研究中,现在就剩下分裂问题了!

论坛徽章:
0
15 [报告]
发表于 2009-11-29 15:08 |只看该作者
有些眉目了,获得巨大进展!
先将Cell.csv删除首行后生成Cell.txt文件
perl -ne "print unless 1 .. 1" <Cell.csv>; Cell.txt

然后分裂Cell.txt为Cell1.txt和Cell2.txt
perl -F; -lane "print \"@F[0..200]\"" <Cell.txt>; Cell1.txt
perl -F; -lane "print \"@F[0..1,201..328]\"" <Cell.txt>; Cell2.txt

但是分裂代码中将Cell1.txt和Cell2.txt文件的分隔符改为了空格,请问如何避免后两行代码改变分隔符!

论坛徽章:
0
16 [报告]
发表于 2009-11-29 20:14 |只看该作者
原帖由 metaxing 于 2009-11-29 15:08 发表
有些眉目了,获得巨大进展!
先将Cell.csv删除首行后生成Cell.txt文件
perl -ne "print unless 1 .. 1" ; Cell.txt

然后分裂Cell.txt为Cell1.txt和Cell2.txt
perl -F; -lane "print \"@F[0..200]\"" ; Cell ...


祝你有进展了。这里是 sample code:
i.e.: cell.csv:
cell format
a1;2;3;4;5;6;7;9;10;a11;12;13;14;15;16;17;18;19;20
b1;2;3;4;5;6;7;9;10;b11;12;13;14;15;16;17;18;19;20


跳过首行,将1..9列输出到新文件1:
perl -F; -alne "next if $.==1;print join ';',@F[0..8]" cell.csv >cell1.txt

跳过首行,将10..尾列输出到新文件2:
perl -F; -alne "next if $.==1;print join ';',@F[9..$#F]" cell.csv >cell2.txt

论坛徽章:
0
17 [报告]
发表于 2009-11-30 10:34 |只看该作者
非常感谢,问题全部完美解决!
对于除Cell.csv以外的文件仅仅适用如下一行指令即可
perl -ne "print unless 1 .. 1" <Adjacency.csv>; Adjacency.txt
....
对于Cell.csv文件则使用如下指令去首行,分裂一次完成!
perl -F; -alne "next if $.==1;print join ';',@F[0..234]" cell.csv >cell1.txt
perl -F; -alne "next if $.==1;print join ';',@F[0..1,235..$#F]" cell.csv >cell2.txt

再次感谢erl_Er,Shell_Er,hulnglei,ulmer (以回帖顺序为序)

论坛徽章:
0
18 [报告]
发表于 2009-11-30 10:40 |只看该作者
不过有个相关问题,还想请教一下,就是内部变量$,
它用来设定输出字段之间的分隔符,请问在Inplace edit指令中如何对他进行设定,以便输出时自动使用设定的字段分隔符!

论坛徽章:
0
19 [报告]
发表于 2009-11-30 11:22 |只看该作者
在print之前设置就可以了
: local $, = "separator"

论坛徽章:
0
20 [报告]
发表于 2009-11-30 13:33 |只看该作者
perl -F; -alne "next if $.==1;local $, = ';';print @F[0..234]" cell.csv >cell1.txt

谢谢,这样执行好像是Ok的,多谢了!

只是我看你给的那里:

原帖由 Perl_Er 于 2009-11-30 11:22 发表
在print之前设置就可以了
: local $, = "separator"


前面有个冒号,不知何意?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP