我有一个.csv文件,格式如下。
id|name|date
我使用以下Awk命令来更改行中的特定列并且它可以正常工作。
awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存输出,但格式会被破坏。
我想要的是什么:100|James|2015
我得到了什么:100 James 2015
如何避开第二个,并获得第一个?
答案 0 :(得分:3)
您可以设置OFS,输出字段分隔符,如下例所示:
awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv
-v OFS=\|
为OFS
变量指定值|
。它是BEGIN { OFS = "|" }
块的替代方案。|
不受shell的影响,因为shell级别是指将一个命令输出到另一个命令的输入中。使用"|"
或\|
是两种方法。答案 1 :(得分:2)
永远不要让shell变量扩展成为awk脚本主体的一部分:
awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
因为它会给你带来这些shell变量的各种值的阴险错误。而是从shell变量填充awk变量并使用脚本中的awk变量:
awk -F "|" -v col="$col" -v val="$val" '{$col=val}1' filename.csv
除了您的具体问题之外,当您为某个字段分配值时,awk会重建记录,因此您需要OFS与FS具有相同的值:
awk -v col="$col" -v val="$val" 'BEGIN{FS=OFS="|"} {$col=val}1' filename.csv