解析文件中具有特定模式的行

解析文件中具有特定模式的行

我有一个大致如下的文件:

[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)
position:
sites: 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6 
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111

现在我想从文件中提取以 [numeric]: 开头的行。不一定是前两行,也可能是前 7 行或前 8 行或其他行。我该如何读取此文件并输出仅包含以 [numeric]: 开头的行的文件?

答案1

使用grep

$ grep "^\[[0-9]\+\]:" file.txt 
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)

要将输出保存在文件中 ( output.txt):

grep "^\[[0-9]\+\]:" file.txt > output.txt

使用python

#!/usr/bin/env python2
import re
with open('/path/to/file.txt') as f:
  print '\n'.join([line.rstrip() for line in f if re.search(r'^\[\d+\]:', line)])

答案2

道路perl

perl -ne 'print "$1\n" if /^(\[[0-9]*\]:.*)/' testdata > out

道路awk

awk 'match($0, /^\[[0-9]*\]:/)' testdata > out

两个命令的输出

[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)

答案3

此任务非常适合grep,因为您只是检查哪些行包含模式匹配并打印匹配的行。

heemayl 的方式非常棒。这是另一个类似的,但使用Perl 正则表达式语法(GNU grep 支持,使用-P),以获得更短且稍微简单的模式:

grep -P '\[\d+\]:' infile

这只是打印输出,但你可以将其重定向到outfile

grep -P '\[\d+\]:' infile > outfile

在 Perl 正则表达式中,\d匹配任意单个数字,与[0-9]或相同[[:digit:]]


如果你感兴趣的话,这里有一个sed方式:

sed -nr '/^\[[0-9]+\]:/p' infile
sed -nr '/^\[[0-9]+\]:/p' infile > outfile

检查每一行是否匹配^\[[0-9]+\]:。如果匹配,则p使用 sed 命令打印该行。该-n标志可防止打印任何行,除非脚本明确规定sed

答案4

[non-numeric]如果文件行开头不可能有,那么只需这样grep -E '^\['做即可,即:

$ cat /tmp/tmp.tmp
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)
position:
sites: 5 4 2 1 3 4 543 5  67 657  78 67 8  5645 6
01010010101010101010101010101011111100011
1111010010010101010101010111101000100000
00000000000000011001100101010010101011111

$ grep -E '^\[' /tmp/tmp.tmp
[25]:0.00843832,469:0.0109533):0.00657864,((((872:0.00120503,((980:0.0001
[29]:((962:0.000580339,930:0.000580339):0.00543993 ((758:0.000598847,726:0.000598847)

$

相关内容