【发布时间】:2014-10-28 09:10:10
【问题描述】:
我是这个东西的新手,遇到了这个问题,我就是想不通:
在 Windows 命令行 (cmd) 中运行的程序 (eG listfilesonhdd) 列出 hdd 上包含大量信息的文件,然后将其通过管道传输到 awk,因为某些文本(带空格)需要替换为文本(带空格) ) 在外部文本文件中,文件如下所示:
assoc.txt:
"this needs to be replaced" "with that"
"and that is replaced" "by that"
"and so on" "it goes"
"TO REPLACE" "WITH"
第一列中的文本需要替换为第二列中的文本。 awk 必须替换来自其他程序的“流”中的匹配项。
所以我尝试了这个命令行
listfilesonhdd | awk "FNR==NR {assoc[$1]=$2; next;} FNR<NR {for(key in assoc) {gsub(key, assoc[key])} printf}" assoc.txt > output.txt
还有
listfilesonhdd | awk "NR==FNR { a[$1]=$2; next} {for(i in a) {for(x=1;x<=NF;x++) {$x=(i==$x)?a[i]:$x}}}1" assoc.txt > output.txt
以及我在这里找到的其他变体,但它总是给我这个错误,有时 FNR 数字会改变,不管我尝试改变什么:
awk: (FILENAME=- FNR=10) warning: error writing standard output (Invalid argument)
这可能意味着文件丢失了,它必须替换文本,但我还没有文件名,我只有这个管道数据,可以这么说。哦,用gawk也试过了,同样的错误。
我在谷歌上搜索了好几天,但我迷路了,我真的很感激,如果有人可以帮助我找到错误,请提前非常感谢你(对不起我的英语)。
【问题讨论】:
-
"this needs to be replaced"不是 awk 的单个字段。它有五个字段:"this、needs、to、be和replaced。所以你的 awk 脚本没有做你想做的事。此外,至少在这里,awk 不会像那样从文件和标准输入中读取数据(不是没有将-列为文件名参数之一)。
标签: windows dictionary command-line awk pipe