私の入力ファイルには、次の形式のデータが含まれています。
1503668542862176 manager=10001|Bounced=999|Analyst=10004|Business Analyst=10005|Programmer=10003
1552024948590636 manager=10001|Bounced=999|Analyst=10004
1551728916565460 Bounced=999|Analyst=10004
1553617087089790 Analyst=10004
1538058487418963 manager=10001|Architect=10002|Analyst=10004
key=value
各ペアを二重引用符で囲み、"key"="value"
次に置き換える必要がある2番目の列を変換する必要があります|
。,
awk
1503668542862176 "manager"="10001","Bounced"="999","Analyst"="10004","Business Analyst"="10005","Programmer"="10003"
1552024948590636 "manager"="10001","Bounced"="999","Analyst"="10004"
1551728916565460 "Bounced"="999","Analyst"="10004"
1553617087089790 "Analyst"="10004"
1538058487418963 "manager"="10001","Architect"="10002","Analyst"="10004"
答え1
$ sed -e 's/|/","/g' -e 's/=/"="/g' -e 's/\t/\t"/' -e 's/$/"/' input.txt
これは次のことを行います。
|
次へ置き換え,
=
次へ置き換え"="
- 最初のタブストップを次に置き換えます
\t"
"
aと行末の追加
最も簡単な方法awk
は、フィールド区切り文字を変更することです。
$ awk -v FS="|" -v OFS='","' '{$1=$1}1' \
| awk -v FS="=" -v OFS='"="' '{$1=$1}1'\
| awk -v FS="\t" '{print $1,"\""$2"\""}' input.txt
答え2
sedを使用してください:
sed -e 's/|/","/g;s/=/"="/g;s/ /"/4;s/$/"/g' file
1503668542862176 "manager"="10001","Bounced"="999","Analyst"="10004","Business Analyst"="10005","Programmer"="10003"
1552024948590636 "manager"="10001","Bounced"="999","Analyst"="10004"
1551728916565460 "Bounced"="999","Analyst"="10004"
1553617087089790 "Analyst"="10004"
1538058487418963 "manager"="10001","Architect"="10002","Analyst"="10004"
答え3
GNU awk(通常はすべての標準Linuxディストリビューションで利用可能)にアクセスできる場合は、関数と共にサブ式を使用できますgensub()
。
< input_data awk -- '{gsub("\\|", ","); print gensub("([[:alpha:]][^=]*)=([^,]+)", "\"\\1\"=\"\\2\"", "g")}'
|
キーと値のペア区切り文字としてのみ表示されると仮定すると、gsub()
各値は最初にin|
に変換され、次に関数は残りの操作を実行します。,
gensub()
POSIX awkを使用する必要がある場合でも、一連の(本当に厄介な...)単一のスクリプトを使用して同じ結果を得ることができますgsub()
。
< input_data awk -- '{gsub("=", "\""); gsub("([[:alpha:]][^\"]*)", "\"&\"="); gsub("\"[^|]*", "&\""); gsub("\\|", ","); print;}'
分析(awk
スクリプト部分のみ):
{
gsub("=", "\"");
gsub("([[:alpha:]][^\"]*)", "\"&\"=");
gsub("\"[^|]*", "&\"");
gsub("\\|", ",");
print;
}
最初のものはgsub()
それぞれ=
をaに置き換えて、"
次のいくつかのsへの道を拭き、最初のものはgsub()
最初のキーまで(含まれていない)キーを探し"
、文字列全体を先行"
+見つかったキー+ Trailingで置き換えます"=
。 2番目は(初期)から最初の(存在する場合)まで(含まれていない)gsub()
値を探し、その文字列をそれ自体と末尾の文字列に置き換えます。"
=
|
"
既定では、2番目のソリューションはセカンダリの"
Key-Value区切り文字として機能するため、キーまたは値には表示されません。
最終的なソリューションはすべて最初のソリューションをgsub()
置き換えます。|
,
答え4
awkコマンドで完了
注文する:
awk '{gsub(/\|/,",",$0);print $0}' filename | awk '{$2="\""$2;print $0}'| awk '{gsub(/\=/,"\"=\"",$0);print $0}'| awk '{gsub(/\,/,"\",\"",$0);print $0}'| awk '{$NF=$NF"\"";print $0}'
出力
awk '{gsub(/\|/,",",$0);print $0}' filename| awk '{$2="\""$2;print $0}'| awk '{gsub(/\=/,"\"=\"",$0);print $0}'| awk '{gsub(/\,/,"\",\"",$0);print $0}'| awk '{$NF=$NF"\"";print $0}'
1503668542862176 "manager"="10001","Bounced"="999","Analyst"="10004","Business Analyst"="10005","Programmer"="10003"
1552024948590636 "manager"="10001","Bounced"="999","Analyst"="10004"
1551728916565460 "Bounced"="999","Analyst"="10004"
1553617087089790 "Analyst"="10004"
1538058487418963 "manager"="10001","Architect"="10002","Analyst"="10004"