AWK-替换选定列的值会破坏输出格式

AWK-替换选定列的值会破坏输出格式,awk,outputformat,Awk,Outputformat,我有一个.csv文件,格式如下。 id | name | date 我正在使用下面的Awk命令来更改行中的特定列,它可以正常工作。 awk-F“|”{$“$col””=“$val”;}1”filename.csv 我想保存输出,但是格式被破坏了 我想要的:100 |詹姆斯| 2015 我得到的:100詹姆斯2015 我如何避免第二个,并得到第一个 您可以设置OFS,输出字段分隔符,如本例所示: awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv

我有一个.csv文件,格式如下。
id | name | date

我正在使用下面的Awk命令来更改行中的特定列,它可以正常工作。
awk-F“|”{$“$col””=“$val”;}1”filename.csv

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

我想要的:
100 |詹姆斯| 2015

我得到的:
100詹姆斯2015


我如何避免第二个,并得到第一个

您可以设置OFS,输出字段分隔符,如本例所示:

awk -F\| -v OFS=\| '{print $1, $2, $3 }'  test.psv 
  • -v OFS=\\\\\
    OFS
    变量赋值
    \
    。它是
    BEGIN{OFS=“|”}
    块的替代
  • 需要保护
    |
    不受shell的影响,因为shell级别的含义是将一个命令的输出传输到另一个命令的输入。使用
    “|”
    \\\\
    有两种方法

您可以设置OFS,输出字段分隔符,如本例所示:

awk -F\| -v OFS=\| '{print $1, $2, $3 }'  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

决不要让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

非常好,非常感谢。想解释一下“|”和“\|”之间的区别吗?另外,'-v'?也很好用,非常感谢。想解释一下“|”和“\|”之间的区别吗?还有“-v”?不客气。如果您打算在UNIX上进行更多的文本操作,我强烈推荐Arnold Robbins编写的《高效Awk编程》第四版。不客气。如果您打算在UNIX上进行更多的文本操作,我强烈推荐Arnold Robbins的《高效Awk编程》第四版。