微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于从另一个文件的块组成文件的shell命令

我有一个数据文件一个包含位置列表的文件,我想从数据文件的块中生成一个文件。 例:

$ cat data abcdefghijkl $ cat positions 0,2 5,8 $ cutter positions data abcfghi

一个(Linux)的shell命令,像我的假设“刀”? “职位”的特定格式并不重要。 我们可以假定在“职位”中指定的块是递增的,并且不重叠。 可能会有一个额外的“刀具”模式,其中位置计数行不是字节。

我可以很容易地实现这样一个程序,但我有这样一个程序已经存在的直觉。

Bash脚本不会继续读取文件的下一行

与&符号在最后和没有

如何在Awk单行/单命令中包含简短函数

什么工具和语言可用于Windows Shell脚本?

为什么在shell脚本中使用双引号

在初始化/ bash脚本中同时执行几个程序

在Linux中检测配额的块大小

在Windows 7中使用批处理脚本检查主机文件的实体?

如何在Windows中使用带有空格的path和命令的“开始”来创buildbatch file

如何为Windows脚本创build唯一的输出文件名?

只需使用参数扩展中的bash子串提取,并使用positions文件格式如下:

data=$(< data) # read the entire file into a variable while IFS=,read start stop; do printf "%s" "${data:$start:((stop-start+1))}" done < positions echo

输出

abcfghi

如果您的数据文件跨越多行,则必须注意位置文件以考虑换行符。

这种方法不需要你将数据文件读入内存:

#!/bin/bash exec 3<data exec 4<positions pos=0 while IFS=,read start stop <&4; do ((nskip = start - pos)) ((nkeep = stop - start + 1)) ((pos += nskip + nkeep)) ((nskip > 0)) && read -N $nskip <&3 read -N $nkeep <&3 printf "%s" "$REPLY" done echo

cut -c将允许你指定固定宽度的列,这似乎是你在找什么:

$ echo "abcdefghijkl" | cut -c 1-3,6-9 abcfghi

请注意,字符位置从1开始,而不是从0开始。可以使用逗号指定各个列,例如cut -c 1,3,5,7 ,或者可以使用短划线指定范围: cut -c 2-8

这可以通过cut Barton Chittenden指出的增加命令替换来完成:

$ cut -c $(cat positions) data abcfghi

“职位”的特定格式并不重要。

我按照预期的方式制定了仓位格式,所以不需要额外的处理。

$ cat data abcdefghijkl $ cat positions 1-3,6-9

您可以通过在~/.bashrc文件添加一个函数来将其转换为cutter命令

function cutter () { $ cut -c $(cat "$1") "$2" }

运行source ~/.bashrc然后你可以根据需要使用cutter :

$ cutter positions data abcfghi

使用重定向输出存储在新文件中:

$ cut -c $(cat positions) data > newfile $ cutter positions data > newfile

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐