2014-11-06 72 views
0

我有一个csv文件,格式如下。awk shell脚本用双引号处理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文件 我不知道如何去吗?

+0

*我需要用什么替换第一列值* – nu11p01n73R 2014-11-06 05:06:11

+0

假设第一个值是Ozz需要被程序中指定的值替换。像Ozz被Razor取代,Max被Maxine取代。 – 2014-11-06 05:08:40

+0

如果除Razor外还有其他值,该怎么办 – nu11p01n73R 2014-11-06 05:09:44

回答

1

可以使用的财产以后像

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

给outpu作为

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

非常感谢帮助..如何运行这个程序? – 2014-11-06 05:25:42

+0

@DeepakG用csv文件名替换'inputFile' – nu11p01n73R 2014-11-06 05:28:46

+0

我能够运行这个命令并得到如下所示的结果。可能我的问题不清楚。如何将其作为shell脚本运行?我正在寻找在csv文件被转储的目录中定期运行? – 2014-11-06 05:31:39

1

如果文件很小(小于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" 

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