【问题标题】:format a file content using shell script [duplicate]使用shell脚本格式化文件内容[重复]
【发布时间】:2021-01-17 22:14:01
【问题描述】:

大家好,我是 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

你能帮我更新一下吗?谢谢

【问题讨论】:

标签: bash shell


【解决方案1】:

考虑使用适当的 CSV 解析工具(如 csvtool)来提取相关列(它比推出您自己的解析更容易且更可靠)。然后,使用tr/sed 进行必要的转换:

sed '1d' file.txt | csvtool -t ',' col 2,3 - | tr -d '"' | sed 's/,/>/'

步骤:

  • 使用sed 删除标题行
  • 使用csvtool 提取第 2 列和第 3 列
  • 使用tr 删除双引号
  • 使用sed第一个 , 映射到>(您不能为此使用tr,因为它会进行全局翻译)

您可以使用包管理器安装csvtool,例如在基于 Debian 的系统上 sudo apt-get install csvtool。将 apt-get 替换为其他系统上的包管理器,例如yum, brew, ...

【讨论】:

    【解决方案2】:

    Ruby 包含一个 CSV 模块:

    ruby -rcsv -e '
      CSV.read(ARGV.shift).map {|row| 
        printf "%s>%s\n", row[1], row[2]
      }
    ' file | sed 1d
    

    【讨论】:

      【解决方案3】:

      enter image description here

      你好先生,我也在学习一个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 
      

      【讨论】:

      • 你好,谢谢你的回答我想要类似的东西 VERSION>FUNDS.TRANSFER,ASS.VERS.TIERS.BOP secondValue>thirdValue
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2012-05-16
      • 2010-11-11
      • 1970-01-01
      • 2012-07-24
      • 2012-08-03
      相关资源
      最近更新 更多