【问题标题】:Gawk Print puzzling behaviorGawk Print 令人费解的行为
【发布时间】:2020-06-19 12:33:36
【问题描述】:

一个 csv 文件有两列。 下面的代码输出整个文件(所有行和用逗号分隔的两列)

BEGIN {FS=","}
{print $0}

但是,下面的代码只输出一个值,即。第一行的第 1 列:

BEGIN {FS=","}
{print $1}

以上代码是一个 .awk 文件,在 Windows 中使用命令 gawk -f test.awk xyz.csv > output.csv 运行

我做错了什么?

编辑: 将 {Print $1} 更改为 "{print "<" NR "><" $1 "><" $0 ">"}"``

后的输出
<1><naskar><naskar,sahoo ,1
sahoo ,18290,
ree ,6379,
mukherjee ,4609,

【问题讨论】:

  • 这不会发生,除非您的 xyz.csv 中有杂散字符。发布file xyz.csv的输出
  • 使用$1时的输出是"naskar"
  • 使用 $0 时的输出是 "naskar, sahoo" 以及下面文件中的所有其余行。
  • 我认为文件有问题(“杂散字符”),因为 Gawk 命令在另一个文件中按预期工作。如何识别并解决导致这种奇怪行为的问题?
  • @EdMorton,谢谢。我认为你的推断是正确的。该文件似乎不是 DOS 文件。有什么方法可以直观地或以其他方式确定文件是否为 DOS?

标签: awk


【解决方案1】:

尝试将 gawk 称为 gawk -v RS='\n' ...,因为最可能的问题是您的输入文件中有 UNIX 行尾 (\n),但您对 gawk 的调用期待 DOS 行尾 (\r\n),因此认为文件是单行。如果不是这样,则将 {print $1} 更改为 {print "&lt;" NR "&gt;&lt;" $1 "&gt;&lt;" $0 "&gt;"} 并创建一个包含 5 行的文件,在其上运行脚本,然后编辑您的问题以显示输入文件和您获得的输出。

【讨论】:

  • 有什么方法可以直观地或以其他方式确定文件是否具有 DOS 行结尾(以供将来使用)?
  • 我不知道 Windows 工具,但在 UNIX 上,您可以在其上运行 file 命令或在其上运行 cat -Ev。在 Windows 上,您可以安装 cygwin 或类似软件来获得一个运行 UNIX 工具的 UNIX 环境。我更新了我的评论作为答案,因为这是你的问题。
【解决方案2】:

在windows下你可以像这样创建一个批处理文件:

@echo off
powershell -Command "write \"$(\"CRLF:\") - $((Get-Content '%1' -Raw) -match '\r\n$')\""
powershell -Command "write \"$(\"CR:\") - $((Get-Content '%1' -Raw) -match '\r$')\""
powershell -Command "write \"$(\"LF:\") - $((Get-Content '%1' -Raw) -match '\n$')\""

对于以 LF 作为行分隔符的文件,它会输出类似这样的内容:

D:\TEMP>file.bat textfile.txt
CRLF: - False
CR: - False
LF: - True
D:\TEMP>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2018-07-02
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2010-11-15
    相关资源
    最近更新 更多