Unix - 按行号显示文件中的一些字符

时间:2015-05-06 09:54:48

标签: unix sed file-processing

我有一个非常庞大的文件,需要在一些巨大的行中间查看几个字符。

是否可以在某个文件中轻松显示行号n1n2位置到l位置的字符?

我认为应该有一些方法可以用sed来做,只是找不到相应的选项。

3 个答案:

答案 0 :(得分:4)

您最好使用awk

awk 'NR==line_number {print substr($0,start_position,num_of_characters_to_show)}' file

例如,从第2行的第2个字符开始打印5个字符:

$ cat a
1234567890
abcdefghij
$ awk 'NR==2 {print substr($0,2,5)}' a
bcdef

如果您确实需要使用sed,可以使用以下内容:

$ sed -rn '2{s/^.{1}(.{5}).*$/\1/;p}' a
bcdef

这在行开头后匹配2-1=1个数字,然后捕获5以将其打印回来。所有这些都是在2行中完成的,因此我们使用-n来阻止该行的默认打印。

答案 1 :(得分:3)

UNIX的优雅在于它能够将相对简单的程序串联到管道中以实现复杂性。您可以只使用sed解决方案,但它不太可能像管道一样可读。

为此,您可以使用sed的组合来获取特定的行,并使用cut来获取该行的字符位置:

pax> echo '12345
...> abcde
...> fghij' | sed -n 2p | cut -c2-4
bcd

如果您只想使用单个工具,awk可以执行此操作:

pax> echo '12345
...> abcde
...> fghij' | awk 'NR==2{print substr($0,2,3);exit}'
bcd

Perl也是如此:

pax> echo '12345
...> abcde
...> fghij' | perl -ne 'if($.==2){print substr($_,1,3); exit}'

在这两种情况下,它都会在相关行之后退出,以避免处理文件的其余部分。

答案 2 :(得分:0)

仅使用的一种解决方案,即在子字符串之前和之后插入换行符,并将其用作标记以删除不在它们之间的所有内容,例如:

sed -n '2 { s/.\{5\}/&\n/; s/.\{2\}/&\n/; s/[^\n]*\n//; s/\n.*//; p; q }' infile

假设infile喜欢:

1234567890
abcdefghij

它产生:

cde

不是那个范围是从25,而是从零开始计数,它排除了结尾(所以字符2,3和4)。您可以在命令之前处理它或进行一些算术运算。