我需要编写采用 yaml 文件的 bash 脚本:
first:John
last:Smith
first:David
last:Bennet
并将其转换为 csv 文件:
John,Smith
David,Bennet
有什么想法吗?谢谢!
答案1
您将找到一个完整的库,并且可以轻松使用它,YAML2CSV......请参阅 github,这里是提供的链接。 https://github.com/tokland/yaml2csv
答案2
以下是一个awk
命令:
awk -v RS="first:|last:" '{gsub("first:|last:","",$0);print $1","$2}' RS='' infile.txt
输出正如您所期望的:
John,Smith
David,Bennet
答案3
使用 sed 和 Miller (https://github.com/johnkerl/miller)并运行:
<input.yaml sed -r 's/:/ /g' | mlr --x2c -N cat >output.csv
你将会拥有
John,Smith
David,Bennet
请注意:您的输入文件不是有效的 yaml。
答案4
您可以使用sed
命令进行此转换:
<file.yaml sed 's/first://g' | sed ':a;N;$!ba;s/\nlast:/,/g' | sed -r '/^\s*$/d' > file.csv
解释 :
<file.yaml
是输入文件(这里是要转换的 YAML 文件)sed 's/first://g'
将删除每个first:
字符串列表字符sed ':a;N;$!ba;s/\nlast:/,/g'
执行的操作与上一个命令几乎相同,但所有选项都用于检测前面的换行符last: string character lists (and replace that with a comma
,`);请参阅此StackOverflow 答案更多详细信息sed -r '/^\s*$/d'
将删除剩下的每个空行,参见StackOverflow 答案更多细节> file.csv
转换完成后,将结果重定向到新.csv
文件(如果此文件不存在,则会自动创建)
结果 :
John,Smith
David,Bennet
创建自己的脚本,该脚本能够将任何.yaml
文件转换为.csv
文件。在我的示例中,我的脚本名为YAMLtoCSV.sh
:
#! /bin/bash
if [ ${1#*.} = "yaml" ]
then
<$1 sed 's/first://g' | sed ':a;N;$!ba;s/\nlast:/,/g' | sed -r '/^\s*$/d' > ${1%%.*}.csv
echo "Conversion from" $1 "to" ${1%%.*}.csv "done"
else
echo "This file didn't have YAML extension"
fi
并执行它(不要忘记使用命令使脚本可执行sudo chmod +x YAMLtoCSV.sh
):
./YAMLtoCSV.sh /home/<user>/file.yaml
file.csv
你会得到一个以你的文件命名的文件.yaml
,所以他的路径是/home/<user>/file.csv
请注意,我添加了一条if
语句以防止文件转换错误(这不会破坏任何数据,但会创建一些无用的其他数据)