AWK - 替换所选列的值会破坏输出格式
AWK - Replacing Value Of Selected Column Destroys Output Format
我有一个具有以下格式的 .csv 文件。
id|name|date
我正在使用以下 Awk 命令更改一行中的特定列并且它有效。
awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存输出,但是格式被破坏了。
我想要什么:100|James|2015
我得到的是:100 James 2015
如何避免第二个,并获得第一个?
您可以设置 OFS,输出字段分隔符,如本例所示:
awk -F\| -v OFS=\| '{print , , }' test.psv
-v OFS=\|
为 OFS
变量赋值 |
。它是 BEGIN { OFS = "|" }
块的替代品。
|
需要受到 shell 的保护,因为 shell 级别的含义是将一个命令输出管道化为另一个命令的输入。使用 "|"
或 \|
是两种方法。
永远不要让 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
我有一个具有以下格式的 .csv 文件。
id|name|date
我正在使用以下 Awk 命令更改一行中的特定列并且它有效。
awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存输出,但是格式被破坏了。
我想要什么:100|James|2015
我得到的是:100 James 2015
如何避免第二个,并获得第一个?
您可以设置 OFS,输出字段分隔符,如本例所示:
awk -F\| -v OFS=\| '{print , , }' test.psv
-v OFS=\|
为OFS
变量赋值|
。它是BEGIN { OFS = "|" }
块的替代品。|
需要受到 shell 的保护,因为 shell 级别的含义是将一个命令输出管道化为另一个命令的输入。使用"|"
或\|
是两种方法。
永远不要让 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