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