大家好,我是shell编程的初学者。在日常工作中,我需要将文件的数据转换为另一种格式,我通常使用文本编辑器手动完成。但是我经常犯错误。所以我决定编写一个简单的脚本,可以为我做这项工作。文件的内容如下
/release201209
a1,a2,"a3",a4,a5
b1,b2,"b3",b4,b5
c1,c2,"c3",c4,c5
:
a2>a3
b2>b3
c2>c3
脚本应该忽略第一行并打印以'>'分隔的第二和第三个值我已经完成了一半,这是我的代码
#!/bin/bash
cat $1 | sed '1d' | cut -d, -f2-3 | tr -d '"' > $2
它工作得很好,直到我发现它不适合a3中包含逗号的数据类型,就像这样:data,VERSION,"FUNDS.TRANSFER,ASS.VERS.TIERS.BOP",,
它返回VERSION>FUNDS.TRANSFER
而不是VERSION>FUNDS.TRANSFER,ASS.VERS.TIERS.BOP
你能帮我更新一下吗?由于
考虑使用适当的CSV解析工具(如csvtool
)来提取相关列(它更容易&比推出自己的解析更可靠)。然后,使用tr
/sed
进行必要的转换:
sed '1d' file.txt | csvtool -t ',' col 2,3 - | tr -d '"' | sed 's/,/>/'
步骤:
- 使用
sed
删除标题行 - 使用
csvtool
提取第二和第三列 - 使用
tr
删除双引号 - 使用
sed
将第一个,
映射到>
(您不能使用tr
,因为它会进行全局转换)
你可以在软件包管理器中安装csvtool
,例如在基于debian的系统上安装sudo apt-get install csvtool
。将apt-get
替换为其他系统上的软件包管理器,例如yum
,brew
,…
Ruby包含了一个CSV模块:
ruby -rcsv -e '
CSV.read(ARGV.shift).map {|row|
printf "%s>%sn", row[1], row[2]
}
' file | sed 1d
输入图片描述
你好先生,我也在学习一个shell脚本,你想要这样吗??
这是我的代码
function klir(){
line2=$(cut -d, -f1 $1 > $1.temp.filterline2)
line3=$(cut -d" -f2 $1 > $1.temp.filterline3)
paste $1.temp.filterline2 $1.temp.filterline3 | sed "s/t/>/g ; 1d"
rm $1.temp.filterline2 $1.temp.filterline3 2>/dev/null
}
klir $1