次の形式のUnixテーブルがあり、出力として隠されています。
+--------------------------+-------------------------+-+
| col_name | type |
+--------------------------+-------------------------+-+
| Name | String |
| Date | Fri 29 13:17:2020 |
+--------------------------+-------------------------+-+
出力:
"col_name","type"
"Name","String"
"Date","Fri 29 13:17:2020"
どんな助けでも大変感謝します。
答え1
この試み:
input ()
{
cat <<EOF
+--------------------------+-------------------------+-+
| col_name | type |
+--------------------------+-------------------------+-+
| Name | String |
| Date | Fri 29 13:17:2020 |
+--------------------------+-------------------------+-+
EOF
}
input |
tr -d '|+-' | # remove decoration
grep -v ^$ | # remove empty lines
while read first rest; do # read first token and rest of the line
printf '"%s","%s"\n' \
"$first" "$rest" # format as required
done
答え2
ソースコードは、コンソールのdbaseクライアントへの応答に似ています。しかし、おそらくメモ帳でUnixのテキストを開くと、行末と多くのスペースが失われます。生形式(比例フォント)を使用すると、ソースは見やすいテーブルを形成します。
+--------------------------+-------------------------+-+
| col_name | type |
+--------------------------+-------------------------+-+
| Name | String |
| Date | Fri 29 13:17:2020 |
+--------------------------+-------------------------+-+
実際の内容が何であるかを確認するには、16進エディタでテキストファイルを確認してください。要求された形式に変換するコマンドを作成できます。 (形式上コメントとして書き込めません。これは何ですか?)
答え3
すべてのフィールド値に引用符を含めることができない場合は、次のawk
プログラムがアクションを実行する必要があります(結果は正規化されていないCSVになります)。
awk -F'|' -v OFS="," '/^\+/{next} {for (i=2;i<NF;i++) {gsub(/^ *| *$/,"",$i); printf("\"%s\"%s",$i,i<(NF-1)?OFS:ORS)}}' input.txt
これは
|
フィールド区切り文字として扱われる- 次の行はすべて無視してください。
+
|
開始しない行の最初と最後の「フィールド」を無視し(最初と最後の後ろの「内容」なので空白です)、残りのフィールドを+
印刷し、スペースを削除して次に置き換えます。二重引用符は、フィールド区切り記号で引用符で囲みます,
。
セル内の先行および末尾の空白は純粋に見た目の空白であり、入力ファイルに空白行が含まれていないと仮定します。