【问题标题】:GnuWin32 Awk in powershell script weird output (First char replaced by a space)powershell脚本中的GnuWin32 Awk奇怪的输出(第一个字符被空格替换)
【发布时间】:2014-04-25 21:32:50
【问题描述】:

我有一个awk 命令,当从 PowerShell 脚本调用时会产生奇怪的输出。它截断每行的第一个字符。如果我在常规批处理文件或 cmd.exe 终端中使用它,它会按预期工作。它在 Linux 下也能正常工作。

谁能解释原因,如果可能的话如何解决?

这是我尝试从 PowerShell 执行的命令:

cat .\corpus_tagged.txt | gawk 'NF>0' | gawk '{bo=$2\"#\"$3; printf \"%s %s %s\",$1,$2,$3; for (i=5;i<=NF; i+=3) {if (bo!=$i\"#\"$(i+1)) printf \" %s %s\",$i,$(i+1);} printf \"\n\"}'

这是从 batch/cmd.exe 运行的命令

cat corpus_tagged.txt | gawk "NF>0" | gawk "{bo=$2\"#\"$3; printf \"%s %s %s\",$1,$2,$3; for (i=5;i<=NF; i+=3) {if (bo!=$i\"#\"$(i+1)) printf \" %s %s\",$i,$(i+1);} printf \"\n\"}"

更易于阅读的 awk 脚本

{
    bo=$2"#"$3;
    printf "%s %s %s",$1,$2,$3;
    for (i=5;i<=NF; i+=3) 
    {
        if (bo!=$i"#"$(i+1)) 
            printf " %s %s",$i,$(i+1);
    }
    printf "\n";
}

我的输入有以下内容:(corpus_tagged.txt 文件)

J' je PP1CSN00 # je PP1CSN00 1 
aime aimer VMIP1S0 # aimer VMIP1S0 0,49045643153527  aimer VMIP3S0 0,49045643153527  aimer VMM02S0 0,0174273858921162  aimer VMSP1S0 0,000829875518672199  aimer VMSP3S0 0,000829875518672199 
les le DA0CP0 # le DA0CP0 0,900251352385116  les PP3CPA00 0,0997486476148844 
ananas ananas NCMN000 # ananas NCMN000 1 
. . Fp # . Fp 1 
Il il PP3MSN00 # il PP3MSN00 1 
aime aimer VMIP3S0 # aimer VMIP1S0 0,49045643153527  aimer VMIP3S0 0,49045643153527  aimer VMM02S0 0,0174273858921162  aimer VMSP1S0 0,000829875518672199  aimer VMSP3S0 0,000829875518672199 
les le DA0CP0 # le DA0CP0 0,900251352385116  les PP3CPA00 0,0997486476148844 
chats chat NCMP000 # chat NCMP000 1 
. . Fp # . Fp 1 

这是我的预期输出:

J' je PP1CSN00
aime aimer VMIP1S0 aimer VMIP3S0 aimer VMM02S0 aimer VMSP1S0 aimer VMSP3S0
les le DA0CP0 les PP3CPA00
ananas ananas NCMN000
. . Fp
Il il PP3MSN00
aime aimer VMIP3S0 aimer VMIP1S0 aimer VMM02S0 aimer VMSP1S0 aimer VMSP3S0
les le DA0CP0 les PP3CPA00
chats chat NCMP000
. . Fp

最后,从 powershell 调用时的输出(每行的第一个字符替换为空格字符

 ' je PP1CSN00
 ime aimer VMIP1S0 aimer VMIP3S0 aimer VMM02S0 aimer VMSP1S0 aimer VMSP3S0
 es le DA0CP0 les PP3CPA00
 nanas ananas NCMN000
  . Fp
 l il PP3MSN00
 ime aimer VMIP3S0 aimer VMIP1S0 aimer VMM02S0 aimer VMSP1S0 aimer VMSP3S0
 es le DA0CP0 les PP3CPA00
 hats chat NCMP000
  . Fp

【问题讨论】:

  • 我试用了你的 PS 单线并得到了预期的输出。
  • 如果您不将每个语句都塞到一行中,您不认为我们阅读您的脚本会更容易吗?无论如何,通常的建议是将您的 awk 脚本放入一个文件中并以 awk -f script 的形式调用它,以避免 DOS 引用(和其他?)问题。
  • @EdMorton 如果我通过将命令放在脚本文件中调用它并使用awk -f 调用它,我会有相同的行为。我将使用更易于阅读的脚本版本来编辑问题。

标签: windows bash batch-file powershell awk


【解决方案1】:

问题最终是我的路径上出现了旧版本的 Gnu Awk。

似乎 GNU Awk 3.0.4 在 GNU Awk 3.1.6 没有的 powershell 环境中存在一些错误。

从我的环境中删除 3.0.4 后修复了它。

【讨论】:

  • 很高兴你知道了。顺便说一句,管道中不需要 2 个 awks,因为 gawk 'NF&gt;0' | gawk '{bo=$2...}' 可以简化为 gawk 'NF{bo=$2...}',您也不需要 cat,因为 cat file | awk '...' 可以简化为 awk '...' file .
  • @EdMorton 感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多