web-dev-qa-db-ja.com

ファイルから特定のパターンの行を解析する

私は大体次のようなファイルを持っています:

[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

次に、ファイルから[数値]:で始まる行のみを抽出します。それは常に最初の2つだけではなく、最初の7または8などでもかまいません。このファイルを読み込んで、[数値]:の行のみを含むファイルを出力するにはどうすればよいですか?

2
user3069326

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)])
9
heemayl

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)
5
A.B.

このタスクは grep に最適です。これは、パターンと一致する行がどの行に含まれているかを確認し、その行を出力するだけだからです。

heemayl's way はすばらしい。同様の別のコードを使用しますが、 Perl正規表現構文 (GNU grepが-Pでサポートします)を使用して、短くて少し単純なパターンを作成します。

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

それは単に出力を印刷しますが、outfileにリダイレクトできます:

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

Perlの正規表現では、\d[0-9]または[[:digit:]]と同じ任意の1桁に一致します。


興味のある方のために、ここに sed の方法があります:

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

各行をチェックして、^\[[0-9]+\]:と一致するかどうかを確認します。その場合、sedコマンドpを使用して行を出力します。 -nフラグは、sedスクリプトによって明示的に提供されている場合を除き、行が印刷されないようにします。

2
Eliah Kagan

ファイル行の先頭に[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)

$
0
boardrider