首页 > 解决方案 > 为什么 awk 给我一个致命错误:I/O?

问题描述

我正在尝试在我的脚本中执行以下代码。这是我的代码的一小部分,它在成功执行我的脚本后引发 I/O 错误。

我对代码的使用有什么问题吗?输出后,我不需要该错误消息将其打印在我的屏幕上。

 awk '/.edu  { sub(".edu",".edu")}}1' | sed 's/\.edu/.fail/g' < temp1.txt >> output.txt

标签: shellunixawk

解决方案


这个:

awk 'script' | sed 'script' < file

告诉 sed 期望它的输入来自 awk 的输出,然后说“哦,不用等待 - 从文件中取它”。它还告诉 awk 在没有输入的情况下运行,所以它会挂起等待你输入一些东西。您可能打算改为这样写:

awk 'script' file | sed 'script'

所以 awk 读取file并将其输出到 sed。话虽如此,您永远不需要将 awk 输出通过管道传输到 sed,您可以在原始 awk 脚本中做任何您想做的事情。你写了:

awk '/.edu | .eda/{c++; if (c==2) { sub(".edu",".edu")}}1' | sed 's/\.edu/.fail/g' < temp1.txt

并在评论中说:

我的要求是:如果在我的输入中看到 .edu 或 .eda ,请将其替换为 .fail。如果该行同时具有 .eda 和 .edu,则仅将 .edu 替换为 .fail 保持 .eda 原样

所以这可能是您真正想要的(未经测试,因为您没有提供任何示例输入/输出来测试:

awk '!sub(/\.edu/,".fail"){sub(/\.eda/,".fail")}1' temp1.txt

推荐阅读