-5

这是输入

R0001 893573.56035613.416.60002 893580.06035624.316.80003 893586.56035635.116.91
R0004 893593.06035646.017.00005 893599.46035656.917.00006 893605.96035667.817.01

我要这个

R0001 893573.56035613.416.6
0002 893580.06035624.316.8
0003 893586.56035635.116.91
R0004 893593.06035646.017.0
0005 893599.46035656.917.0
0006 893605.96035667.817.01

我使用 linux centos 5.4

4

2 回答 2

1

假设您的数据位于名为“file”的文件中:

sed -i 's/^\(.\{27\}\)\(.\{26\}\)\(.*\)/\1\n\2\n\3/g' file

sed 是一个非常强大的文本处理工具,虽然不是最容易使用的(但是当你想制作这样的例子时非常容易)。这是魔术:

“-i”是单引号中“为我做这些事情”的标志,有一条指令由斜杠分隔的四个部分组成:1.命令:“s” - 替换 2.模式:想要改变什么 3.预期结果:您希望它看起来如何 4. 范围:“g” - 全局

模式是

\(.\{27\}\)\(.\{26\}\)\(.*\)

这意味着“在一行中制作一组前 27 个字符,然后制作另一组接下来的 26 个字符,然后制作第一组该行中所有剩余字符的组”。

预期的结果是

\1\n\2\n\3

意思是“粘贴第一组,粘贴新行,粘贴第二组,粘贴新行,粘贴第三组”。

为了更清楚,您可以将其放在脚本中:

#!/bin/bash
COLUMN1=27
COLUMN2=26
FILENAME="file"     
sed -i "s/^\(.\{$COLUMN1\}\)\(.\{$COLUMN2\}\)\(.*\)/\1\n\2\n\3/g" file
exit 0

要使脚本打开任何文件编辑器(我使用 vim,其他选项是 emacs、nano、kwrite、kate、geany、gedit ......我可以整天这样)并粘贴上面的代码。保存,关闭编辑器并发出

chmod +x script

能够执行它。你调用脚本

./script

现在您可以为脚本提供参数,检查“文件”是否存在,添加更多断点……但那是另一回事了。

然后你可以使用不同的工具,比如 awk(我强烈推荐,但我在 vim 中编写时通常使用正则表达式,并且 sed 更像 vim 而不是 awk,所以我觉得它更舒服)。

更多阅读:

http://www.brunolinux.com/02-The_Terminal/Find_and%20Replace_with_Sed.html

http://www.grymoire.com/Unix/Sed.html

http://www.hcs.harvard.edu/~dholland/computers/awk.html

http://www.regular-expressions.info/

于 2013-10-29T21:48:23.177 回答
0

如果您的输入在in.txt中定义,则可能的解决方案可能是:

#!/usr/bin/perl
use strict;
use warnings;

open ( FILE, "<", "in.txt") or die $!;
while (my $line = <FILE>) {

my $tmp = join("\n", unpack("(A53)*", $line));
my $message = join("\n", unpack("(A27)*", $tmp));
print "$message\n";

}
close(FILE);

我认为这不是最好的解决方案,因为它不适用于长线。但我在 Perl 中试了一下。

于 2013-10-29T22:04:45.997 回答