web-dev-qa-db-ja.com

正規表現を使用してテキストファイルの数値を抽出する

次のテキストを含む2>&1 | tee ./ results.txtファイルに.txtで端末の出力を保存しています。

executing: ./home/images/image-001-041.png
0,33, /results/image-001-041.png
1.7828,32, /results/image-001-040.png
1.86051,34, /results/image-001-042.png
1.90462,31, /results/image-001-039.png
1.90954,30, /results/image-001-038.png
1.91953,35, /results/image-001-043.png
1.92677,28, /results/image-001-036.png
1.92723,3160, /results/image-037-035.png
1.93353,7450, /results/image-086-035.png
1.93375,1600, /results/image-019-044.png

2番目の数値(最初のコンマ記号の後、つまり33,32,34、...)を取得し、Pythonのリストに保存する必要があります。 bashコマンド、またはPythonの正規表現コマンドとは何ですか?ありがとう

5
sc241

cutを使用:

cut -sd',' -f2 < result.txt

from man cut

-d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter
-s, --only-delimited
          do not print lines not containing delimiters
-f, --fields=LIST
          select only these fields;  also print any line that contains
          no delimiter character, unless the -s option is specified
11
αғsнιη

あなたはawkを使うことができます

awk -F ',' '{print $2}' results.txt

フィールド区切り記号としてコンマを定義し、2番目の列を印刷します。

6
stumblebee

sedの例

$ sed -rn 's/[^,]+,([^,]+),.*/\1/p' results.txt
33
32
34
31
30
35
28
3160
7450
1600

ノート

  • -n要求するまで何も出力しません(一致しない行を削除します)
  • -r EREを使用します(したがって、+および()メタキャラクターにバックスラッシュは必要ありません)
  • [^,]+,いくつかの非コンマとそれに続くコンマ
  • ([^,]+),いくつかの非コンマの後にコンマを続けて保存します(この部分だけが必要です)
  • .*任意の数の文字(残りの行を削除します)
  • \1保存したパターン
  • p変更した行を出力します(-nで必要)
5
Zanna

Pythonについて言及しているため:

with open('results.txt') as results:
    ids = [int(line.split(',')[1]) for line in results if ',' in line]
    print(ids)

idsとして整数のリストを作成し、表示します:

[33, 32, 34, 31, 30, 35, 28, 3160, 7450, 1600]
3
Eric Duminil

投稿されたawkおよびsedソリューションに類似したPerlを使用できます。

-aは、各行の自動分割を有効にします。

-Fは、各行を分割する区切り文字を指定するために使用されます。デフォルトは ''です。その後、結果は@Fに保存されます。したがって、$ F [1]は2番目の列を提供します。

-lは、各行に改行が追加されるようにします。

-eは、印刷される各行で実行する必要があるコマンドを指定するために使用されます

$ Perl -F, -ale 'print $F[1]' results.txt
33
32
34
31
30
35
28
3160
7450
1600

上記は以下のプログラムに展開されます:

$ Perl -MO=Deparse -F, -ale 'print $F[1]' results.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = readline ARGV)) {
    chomp $_;
    our @F = split(/,/, $_, 0);
    print $F[1];
}
-e syntax OK
2
Wordzilla