linux – 如何提取每N列并写入新文件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 如何提取每N列并写入新文件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2194字,纯文字阅读大概需要4分钟。
内容图文
![linux – 如何提取每N列并写入新文件?](/upload/InfoBanner/zyjiaocheng/961/aebea5a47f2748cf83b0aab925d06f4a.jpg)
我一直在努力编写一个代码,用于从输入文件中提取每N列,并根据它们的提取顺序将它们写入输出文件.
(我的真实情况是从第6列开始从总共24005列文件中提取每800列,所以我需要一个循环)
在下面的更简单的情况下,从输入文件中提取每3列(字段)的第二列的起点.
例如,如果输入文件如下所示:
aa 1 2 3 4 5 6 7 8 9
bb 1 2 3 4 5 6 7 8 9
cc 1 2 3 4 5 6 7 8 9
dd 1 2 3 4 5 6 7 8 9
我希望输出看起来像这样:
output_file_1:
1 2 3
1 2 3
1 2 3
1 2 3
output_file_2:
4 5 6
4 5 6
4 5 6
4 5 6
output_file_3:
7 8 9
7 8 9
7 8 9
7 8 9
我试过这个,但它不起作用:
awk 'for(i=2;i<=10;i+a) {{printf "%s ",$i};a=3}' <inputfile>
它给了我语法错误,我解决了更多的问题.
我也尝试过linux命令,但是当我处理大文件时,这似乎毫不费力.我想知道切割是否会像awk一样对每3个字段进行循环切割.
有人可以帮我解决这个问题并给出快速解释吗?提前致谢.
解决方法:
由awk对输入数据执行的操作必须包含在卷曲的大括号中,因此您尝试的awk单行导致语法错误的原因是for循环不遵守此规则.语法正确的版本将是:
awk '{for(i=2;i<=10;i+a) {printf "%s ",$i};a=3}' <inputfile>
这在语法上是正确的(差不多,请看这篇文章的结尾.),但是没有按照你的想法去做.
要按不同文件上的列分隔输出,最好的方法是使用awk重定向运算符>.如果输入文件总是有10列,这将为您提供所需的输出:
awk '{ print $2,$3,$4 > "file_1"; print $5,$6,$7 > "file_2"; print $8,$9,$10 > "file_3"}' <inputfile>
注意“”指定文件名.
编辑:真实的世界案例
如果你必须循环列,因为你有太多的列,你仍然可以使用awk(gawk),有两个循环:一个在输出文件上,一个在每个文件的列上.这是一种可能的方式:
#!/usr/bin/gawk -f
BEGIN{
CTOT = 24005 # total number of columns, you can use NF as well
DELTA = 800 # columns per file
START = 6 # first useful column
d = CTOT/DELTA # number of output files.
}
{
for ( i = 0 ; i < d ; i++)
{
for ( j = 0 ; j < DELTA ; j++)
{
printf("%f\t",$(START+j+i*DELTA)) > "file_out_"i
}
printf("\n") > "file_out_"i
}
}
我在你的例子中的简单输入文件上试过这个.如果CTOT可以除以DELTA,它就可以工作.我假设你有浮动(%f)只是根据你的需要改变它.
让我知道.
附:回到原来的单行,注意循环是无限的,因为我没有增加:我必须用i = a代替,a = 3必须在内括号内:
awk '{for(i=2;i<=10;i+=a) {printf "%s ",$i;a=3}}' <inputfile>
这会在每个周期评估a = 3,这有点无意义.因此,更好的版本是:
awk '{for(i=2;i<=10;i+=3) {printf "%s ",$i}}' <inputfile>
不过,这只会打印文件的第2,第5和第8列,这不是您想要的.
内容总结
以上是互联网集市为您收集整理的linux – 如何提取每N列并写入新文件?全部内容,希望文章能够帮你解决linux – 如何提取每N列并写入新文件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。