【问题标题】:What are the possible reasons why awk failed in the following scenario?awk 在以下场景中失败的可能原因是什么?
【发布时间】:2015-04-22 03:48:08
【问题描述】:

我在 shell 脚本中使用了以下命令

awk '{print $0","}' file1.txt > file2.txt

结果是创建了 file2.txt,但每行末尾没有 ','。并且 shell 脚本执行在 awk 行停止。我看不出它失败的任何原因。有人可以解释一下 awk 的这种行为吗?

【问题讨论】:

  • 不为空,file2.txt 包含了 file1.txt 中的所有数据,但每行末尾没有','。
  • 对不起,那是编辑错误。它实际上是awk '{print $0","}' file1.txt > file2.txt
  • 奇怪,命令对我有用。尝试sed 's/$/,/' file1.txt > file2.txt 继续您的脚本。
  • awk 命令也适用于我。
  • awk 究竟是如何知道它是行尾的?因为当我运行它时,它不会在末尾添加“,”,而是将每行的第一个字符替换为“,”

标签: unix awk ksh


【解决方案1】:

...它不是在末尾添加“,”,而是将每行的第一个字符替换为“,”

您的文件中有 DOS/Windows 样式的换行符(回车、换行)。因此,awk 将逗号放在 回车之后但 放在换行符之前。考虑这个带有 DOS 行结尾的文件:

$ cat file1.dos
line one
line two
line three

如果我们运行 awk 命令,结果如下:

$ awk '{print $0","}' file1.dos
,ine one
,ine two
,ine three

使用 dos2unix 或 tr 删除 DOS 行尾。例如:

$ tr -d '\r' <file1.dos >file1

现在,它可以正常工作了:

$ awk '{print $0","}' file1
line one,
line two,
line three,

【讨论】:

  • 谢谢,它与您指定的完全一样,该文件是 windows 格式的。现在已经解决了。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多