3

それぞれが3つの列を含む多くのデータファイルを生成するc++プログラムがあります。これらの各データファイルには、3番目の列に。が含まれる異常なエントリが含まれている可能性があります-nan。これらの各データファイルを開き、3番目の列にあるすべての行を検索し、そのnanようなすべての行を削除するようにスクリプトを作成するにはどうすればよいですか?これを実行できるスクリプトをbashまたはpythonで作成することは可能ですか?例:

100   0.1    15.8334
100   0.2    16.7895
100   0.3     -nan
100   0.4    15.8543
100   0.5      -nan

このファイルでは、3行目と5行目を削除して、ファイルが次のようになるようにします。

100   0.1    15.8334
100   0.2    16.7895
100   0.4    15.8543
4

3 に答える 3

3

(bashで)のようなもの:

for file in files ;do
  grep -v -- -nan file > file.$$ && mv file.$$ file
done

ただし、おそらくコードでクリーンアップする必要があります。

于 2012-07-12T13:14:58.203 に答える
2
sed -i -e '/-nan/d' datafile.txt

複数のファイルを操作するには、「datafile.txt」をすべてのファイルに一致するグロブに置き換えるか、forループを使用します

for file in data1.txt data2.txt data3.txt; do
    sed -i -e '/-nan/d' $file
done

またはおそらくfindコマンド:

find . -name "data*.txt" -exec sed -i -e '/-nan/d' {} +
于 2012-07-12T13:23:05.680 に答える
1

これが基本的なメカニズムです。

with open('yourfile.txt') as fin, open('yourfile_output.txt', 'w') as fout:
    for line in fin:
        try:
            c1, c2, c3 = line.split()
            if c3 != '-nan':
                fout.write(line)
        except ValueError as e:
            pass # Handle cases where number of cols != 3

次に、それを関数に入れ、glob.iglobを使用して、一致するファイル名のリストを返し、ループします...

完全を期すためのもう1つの可能なオプション:

from math import isnan

with open('yourfile.txt') as fin, open('yourfile_output.txt', 'w') as fout:
    for line in fin:
        try:
            c1, c2, c3 = map(float, line.split())
            if not isnan(c3):
                fout.write(line)
        except ValueError as e:
            pass # Handle cases where number of cols != 3
于 2012-07-12T13:15:17.733 に答える