フィールド区切り記号と引用符の変更

フィールド区切り記号と引用符の変更

2つの異なるファイルの内容を変更したいと思います。 Unixで通常のスクリプトを使用して予想される出力を取得するには?

最初のファイル: "引用符付き文字列の内部と引用符付き "文字,列の内部(区切り文字)

例:

"20181115","12345643","This is a "test"","","657","This is a "TEST"","","aaaa"
"20181115","12345632","This is an "example" of the file, a "sample" aaaa","123","",""TEST"","",""

予想出力:

~20181115~;~12345643~;~This is a "test"~;~~;~657~;~This is a "TEST"~;~~;~aaaa~
~20181115~;~12345632~;~This is an "example" of the file, a "sample" aaaa~;~123~;~~;~"TEST"~;~~;~~

2番目のファイル:( |区切り文字)引用符で囲まれた文字列と"文字列内の複数

例:

"098789"|"Hello world!"| 12,7|"Cities I want to visit Rome| London"|15.11.2018|"Yes"
"032425"|"Travel in ""New York"", USA"| 113,3||15.11.2018|"Yes"

予想出力:

~098789~;~Hello world!~; 12,7;~Cities I want to visit Rome| London~;15.11.2018;~Yes~
~032425~;~Travel in /"New York/", USA~; 113,3;;15.11.2018;~Yes~

答え1

簡単な置き換えでsed最初の問題を解決してください。

sed 's/","/~;~/g; s/^"\|"$/~/g' file

awk2番目に複雑なスクリプトは次のとおりです。

awk -F\" '{$1=$1; for (i=2; i<=NF; i+=2) gsub ("\|", SUBSEP, $i); gsub ("\|", ";"); gsub ("~~", "/\""); gsub (SUBSEP, "|")} 1' OFS="~" file 

まず|、二重引用符内のすべての内容をテキストファイルで一般的に見つからない非一般的なプレースホルダに置き換えてから、必要な代替操作を実行してからプレースホルダ置換を元に戻します。

どちらも問題に合わせてカスタマイズされているため、通常は調整なしでは同様の問題でも他の問題に対しては機能しません。

質問の例に適用すると、次のように出力されます(Ubuntu、mawk 1.3.3 Nov 1996)。

~098789~;~Hello world!~; 12,7;~Cities I want to visit Rome| London~;15.11.2018;~Yes~
~032425~;~Travel in /"New York/", USA~; 113,3;;15.11.2018;~Yes~

関連情報