私は大体次のようなファイルを持っています:
[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などでもかまいません。このファイルを読み込んで、[数値]:の行のみを含むファイルを出力するにはどうすればよいですか?
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)])
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)
このタスクは 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
スクリプトによって明示的に提供されている場合を除き、行が印刷されないようにします。
ファイル行の先頭に[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)
$