2016-03-20 29 views
0

我有一个.csv文件,格式如下。 id|name|dateAWK - 替换选定列销毁值的输出格式

我正在使用下面的Awk命令来更改一行中的特定列,它的工作原理。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv

我想保存输出,但格式被破坏。

我想要什么:100|James|2015

我能得到什么:100 James 2015

如何避免第二个,并获得第一个?

回答

3

你可以设置OFS中,输出字段分隔符像在本例中:

awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv 
  • -v OFS=\|分配OFS变量的值|。它是BEGIN { OFS = "|" }区块的替代方案。
  • |需要被shell保护,因为shell级别的含义是将一个命令的管道输出到另一个命令的输入中。使用"|"\|是两种方法。
+0

工作非常好,非常感谢。小心解释“|”之间的区别和'\' ?还有'-v'? – Alkiviadis95

2

不要让shell变量扩大成为一个awk脚本的身体的一部分:因为它可能让你到给出的shell变量的各种值阴险错误

awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv 

。而不是从shell变量填充awk中的变量并在脚本中使用awk的变量:

awk -F "|" -v col="$col" -v val="$val" '{$col=val}1' filename.csv 

WRT您的具体问题,但是,AWK当值分配给现场重建的记录,所以你需要的OFS有与FS相同的值:

awk -v col="$col" -v val="$val" 'BEGIN{FS=OFS="|"} {$col=val}1' filename.csv 
+0

不客气。如果您打算在UNIX上进行更多的文本操作,我强烈推荐Arnold Robbins编写的“Effective Awk Programming,4th Edition”一书。 –