![sedを使用してCSVから数値区切りカンマと引用符自体を削除しますか? [コピー]](https://linux33.com/image/47652/sed%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6CSV%E3%81%8B%E3%82%89%E6%95%B0%E5%80%A4%E5%8C%BA%E5%88%87%E3%82%8A%E3%82%AB%E3%83%B3%E3%83%9E%E3%81%A8%E5%BC%95%E7%94%A8%E7%AC%A6%E8%87%AA%E4%BD%93%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
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