【发布时间】: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