awkを使用したファイル形式の指定

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

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"

関連情報