【问题标题】:awk shell script to process a csv file with double quotes用于处理带双引号的 csv 文件的 awk shell 脚本
【发布时间】:2014-11-06 04:59:40
【问题描述】:

我有一个格式如下的 csv 文件。

event1,event2,event3,event4  
"Ozz","time","1234","test1"  
"Max","time1","5678","test2"  

我需要在不更改标题的情况下替换第一列的值。 我需要将第二列的值复制到第三列。 所以预期的输出是:

event1,event2,event3,event4  
"Razor","time","time","test1"  
"Maxine","time1","time1","test2"  

输出到另一个 csv 文件 我不知道该怎么做?

【问题讨论】:

  • 我需要用什么替换第一列的值
  • 说第一个值是 Ozz 需要替换成程序上指定的值。比如 Ozz 被 Razor 取代,Max 被 Maxine 取代。
  • 如果有 Razor 以外的其他值怎么办
  • 不管第一个值是什么。我正在尝试用定义的值替换/替换
  • 那么我刚刚添加的答案怎么样。这就是你要找的吗?

标签: shell csv awk


【解决方案1】:

你可以使用类似的东西

awk 'BEGIN{FS=OFS=","} $1~/^".*"$/{gsub("^\"Ozz\"$", "\"Razor\"",$1); gsub("^\"Max\"$","\"Maxine\"", $1); $3=$2;print $0} /event/' inputFile

输出为

 event1,event2,event3,event4
"Razor","time","time","test1"
"Maxine","time1","time1","test2"

【讨论】:

  • 非常感谢您的帮助。如何运行这个程序?
  • @DeepakG 用 csv 文件名替换 inputFile
  • 我能够运行此命令并获得如图所示的结果。可能是我的问题不清楚。如何将其作为 shell 脚本运行?我希望在转储 csv 文件的目录中定期运行它?
  • 如果您想定期安排脚本,cron 会帮助您。阅读documentation
  • 这个输出没有标题
【解决方案2】:

如果文件很小(少于 100 行),则使用纯 是一个不错的选择:

exec 3<inputfile
read -ru 3 a; echo $a
while IFS=, read -ru 3 v a b b; do
    v=${v/#\"/};v=${v/%\"/} # Trim surrounding "
    case $v in
    Ozz) v=Razor;;
    Max) v=Maxine;;
    *) echo "Wrong value '$v'">&2; v=Default;;
    esac
    echo "\"$v\",$a,$a,$b"
done

输出:

event1,event2,event3,event4
"Razor","time","time","test1"
"Maxine","time1","time1","test2"

可以从另一个文件中读取替换,并且可以使用散列进行替换。

【讨论】:

    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多