0

私はこのようなテキストを持っています:

characters      value ∆delta     

ABCDEABCDE      -3.663  [analyze]
EFGHEFGHEF      -1.937  [analyze]
IJKLIJKLIJ      2.137   [analyze]

数値を抽出したい

私は正規表現についてグーグルで検索し、このperlワンライナーを思いついた

perl -p -i -e 's/[^0-9-.]//g' file.txt

これはあなたにとって非常に悪く見えるに違いありませんが、この場合は私にとってはうまくいくようです。唯一の問題は、テキストファイルが次のようになっていることです。

-3.663-1.9372.137

でも私はそれを次のように見せたい

-3.663
-1.937
2.137

この正規表現の各一致の間に新しい行を挿入するにはどうすればよいですか?

ありがとう!

4

6 に答える 6

1

文字クラスに改行を追加する必要があります

perl -p -i -e 's/[^0-9-.\n]//g' file.txt

これは改行を「追加」するのではなく、既存のものを保持します。正規表現ではなく列に基づいてこれを達成する方法は他にもあります。

awk:

awk '{print $2}' file.txt > tmpfile.txt && mv tmpfile.txt file.txt

バッシュ/sh:

while read -r _ data _; do
   echo "$data"
done < file.txt > tmpfile.txt
mv tmpfile.txt file.txt
于 2012-06-26T22:09:16.413 に答える
1

あなたはうまくいくはずです:

perl -p -i -e 's/[^-\d.\n\r]+//g' file.txt

あなたも試すことができます:

perl -p -i -e 's/[^-\d.]*(\-?[\d\.]+)[^-\d.]*/$1\n/g' file.txt 

または、テキストに数字が含まれ.ていてもいなくてもよい場合 (例: )、次のようになります。-ABC-DEF.GHI -3.663 [analyze]

perl -p -i -e 's/(?:[^-\d.]+|\-(?!\d)|\.(?!\d))*(\-?(?:\d?\.?\d+|\d+\.?\d*))(?:[^-\d.]+|\-(?!\d)|\.(?!\d))*/$1\n/g' file.txt 
于 2012-06-26T22:10:34.743 に答える
1

タブ区切りのデータがあるので、それを利用して最適な結果を得ましょう。

perl -i -F\\t -lanE'BEGIN { <>; <>; } say $F[2]' file.txt

データが単に空白で区切られている場合は、お勧めします

perl -i -lanE'BEGIN { <>; <>; } say $F[2]' file.txt
于 2012-06-26T22:35:36.340 に答える
0

ソリューションはどのように機能しますか?-私はに変更-peしただけ-lpeです:

 perl -i -lpe 's/[^0-9.-]//g' file.txt

これは次のように短縮できます。

 perl -i -lpe's/[^--9]//g' file.txt

よろしく

rbo

于 2012-06-26T22:53:09.157 に答える
0

問題の「簡単な」解決策は、-l行末を処理するオプションを使用することです。あなたの場合、-pオプションを使用して印刷に改行を追加します。

perl -pi -le 's/[^0-9-.]//g' file.txt

ただし、このソリューションは破壊的であり、入力ファイルが破棄され、ファイルに他の数字、ダッシュ、およびピリオドが存在しないと想定されます。後者は簡単にデータを破損します。

私の意見では、タブまたは空白で分割する池上のソリューションが最適です。ただし、正規表現を使用して完全な数値を抽出することもできます。

perl -nlwe 'print /(-?[\d.]+)/' file.txt

これにより、数字とピリオドで構成される最初の文字列が抽出され、オプションで先頭にダッシュが付きます。出力をファイルに保存する場合は、単にリダイレクトします

perl -nlwe 'print /(-?[\d.]+)/' file.txt > output.txt
于 2012-06-26T22:59:58.923 に答える
0

すべての返信に感謝します。スクリプトは数値の間に新しい行を挿入しましたが、文書内の空の行を削除しませんでした (たとえば、最初のサンプル テキスト ファイルの 1 つの空の行)。少なくとも、それが私のテスト テキスト ファイルの結果です。空行を削除する方法をグーグルで検索しましたが、結合することはできませんが、2 つのワンライナーを使用して必要なものを取得できるようになりました

perl -i -lpe's/[^--9]//g' file .txt
perl -pi -e "s/^\n//" file .txt
于 2012-06-27T19:17:37.673 に答える