4

GNU sed と BSD sed の違いについて少し知っています。残念ながら、私は Linux マシンを持っていません。Mac しか利用できません。

コンマで区切られた csv 形式の大きなデータ ファイルがあります。ファイルの最初の 2 行は大きすぎてここに掲載できません。最初の 2 行はこちらで確認できます。

0、8、9、-999、-999.0 の値を "NA" に置き換える必要があります。これらの値は欠損値のコードであるためです。

bashプロンプトで次のsedコマンドを使用しました

sed -e 's/\-999\.?\0?/NA/g' \
    -e 's/\-999/NA/g' \
    -e 's/,9,/,NA,/g' \
    -e 's/,8,/,NA,/g' \
    -e 's/,0,/,NA,/g' \
    firsttwolines.csv

単一の0. 修正方法は?そして、それをbashスクリプトに入れる方法は? このタスクを達成するためのより良い方法はありますか?

4

3 に答える 3

1

私の経験では、CSV ファイル形式を扱う場合、sed や awk などのテキスト スキャン ツールはすべての特殊なケースに対応するには不十分です。あなたが特にsedでの解決策を求めたことは知っていますが、うまくいきません。Python や Tcl など、堅牢な CSV ファイル処理を提供する言語をお勧めします (他にもありますが、これらは私が知っていることです)。Pythonでの解決策は次のとおりです。

# csvreplace.py

import sys
import csv

if __name__ == '__main__':
    infilename = sys.argv[1]
    outfilename = sys.argv[2]

    with open(infilename) as infile, open(outfilename, 'w') as outfile:
        csvreader = csv.reader(infile)
        csvwriter = csv.writer(outfile)
        na_list = ['0', '8', '9', '-999', '-999.0']
        for row in csvreader:
            row = [col in na_list and 'NA' or col for col in row]
            csvwriter.writerow(row)

bash スクリプトで次のように使用できます。

python csvreplace.py data.csv out.csv
于 2013-03-11T18:27:08.747 に答える
0

このタスクにはawkの方が適していると思います(gawkとnawkでテスト済み):

awk '{ for(i=1; i<=NF; i++) if($i == 0 || $i == 8 || $i == 9 || $i == -999) $i = "NA" } 1' FS=, OFS=, firsttwolines.csv

for ループは各フィールドを実行し、NA リストと等しいかどうかをテストします。真であることが判明した場合、フィールドは に置き換えられNAます。テストの前に awk がフィールドを数値に変換することに注意してください。最後の1はデフォルト ブロックを呼び出します{ print $0 }

于 2013-03-11T18:33:37.090 に答える
0

sedを使用して、次を試してください:

sed -e 's/\-999\(\.0\)*/NA/g' -e :a -e 's/,[089],/,NA,/; ta' file
于 2013-03-11T21:30:24.137 に答える