我有一个.csv文件,格式如下。 id|name|date
AWK - 替换选定列销毁值的输出格式
我正在使用下面的Awk命令来更改一行中的特定列,它的工作原理。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存输出,但格式被破坏。
我想要什么:100|James|2015
我能得到什么:100 James 2015
如何避免第二个,并获得第一个?
我有一个.csv文件,格式如下。 id|name|date
AWK - 替换选定列销毁值的输出格式
我正在使用下面的Awk命令来更改一行中的特定列,它的工作原理。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存输出,但格式被破坏。
我想要什么:100|James|2015
我能得到什么:100 James 2015
如何避免第二个,并获得第一个?
你可以设置OFS中,输出字段分隔符像在本例中:
awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv
-v OFS=\|
分配OFS
变量的值|
。它是BEGIN { OFS = "|" }
区块的替代方案。|
需要被shell保护,因为shell级别的含义是将一个命令的管道输出到另一个命令的输入中。使用"|"
或\|
是两种方法。不要让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
不客气。如果您打算在UNIX上进行更多的文本操作,我强烈推荐Arnold Robbins编写的“Effective Awk Programming,4th Edition”一书。 –
工作非常好,非常感谢。小心解释“|”之间的区别和'\' ?还有'-v'? – Alkiviadis95