sedを使用してCSVから数値区切りカンマと引用符自体を削除しますか? [コピー]

sedを使用してCSVから数値区切りカンマと引用符自体を削除しますか? [コピー]

sedを使用して、カンマの前の数値グループと最後の列の引用符自体を削除するにはどうすればよいですか?

次の例では、ターゲット列は二重引用符で囲まれていません。

0,1,,,"10,815,197",
6,7,010202,,"5,589",
6,7,010202,,589,

予想される結果は次のとおりです。

0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,

答え1

Awkあなたにとって最高のシナリオになります。

$ awk -F'"' '{gsub(",", "", $2);print}' file.txt 
0,1,,, 10815197 ,
6,7,010202,, 5589 ,
6,7,010202,,589,

どのように動作しますか?

-F'"' -AWKレコード区切り記号として二重引用符(")を使用します。

gsub(",","",$2)- このgsub関数はすべての二重引用符を検索して空の文字列に置き換えます。

print - 修正した内容を出力に印刷します。

答え2

使い方が簡単だと思いますawk。次のように試すことができます。

$ awk -v v='"' 'BEGIN{FS=OFS=v}{gsub(",","",$2);gsub("\"","",$0);print }' file.txt
0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,
  • デフォルトでは、awk正規表現を-v v='"'フィールド区切り文字として使用することを意味します。
  • FS=OFS=vフィールド区切り記号が出力フィールド区切り記号と同じであると述べました"
  • gsub (",","",$2),2番目のフィールドを空のフィールドに置き換えます$2(開始と終了で区切られています")。
  • gsub("\"","",$0)"ラインを印刷する前にライン全体をインポートし、何でも交換してください。

答え3

sed は、この目的に適したツールではありません。

$ perl -pe 's|"([\d,]+)"(?=[^"]*$)|$1=~y/,//dr|eg' file
0,1,,,10815197,
6,7,010202,,5589,
6,7,010202,,589,

Pythonを通して。

#!/usr/bin/python3
import sys
import re
file = sys.argv[1]
with open(file, 'r') as f:
    for line in f:
        print(re.sub(r'"([\d,]+)"(?=[^"]*$)', lambda m: m.group(1).replace(',', ''), line), end = "")

上記のスクリプトをファイルとして保存しscript.pyたら、端末で次のコマンドを実行して実行します。

$ python3 script.py inputfile

関連情報