Awk 目瞪口呆的打印令人费解的行为

Awk 目瞪口呆的打印令人费解的行为,awk,Awk,csv文件有两列。 下面的代码输出整个文件(所有行和两列之间用逗号分隔) 但是,下面的代码只输出一个值,即。第一行的第1列: BEGIN {FS=","} {print $1} 上面的代码是一个.awk文件,使用命令gawk-f test.awk xyz.csv>output.csv在Windows中运行 我做错了什么 编辑: 将{Print$1}更改为“{Print”“}后的输出`` 尝试调用gawk作为gawk-v RS='\n'.,因为最可能的问题是输入文件中有UNIX行结尾(\n),但

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

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

BEGIN {FS=","}
{print $1}
上面的代码是一个.awk文件,使用命令gawk-f test.awk xyz.csv>output.csv在Windows中运行

我做错了什么

编辑: 将{Print$1}更改为“
{Print”“}
后的输出``


尝试调用gawk作为
gawk-v RS='\n'.
,因为最可能的问题是输入文件中有UNIX行结尾(
\n
),但对gawk的调用需要DOS行结尾(
\r\n
),因此认为该文件是单行。如果不是这样,则将
{print$1}
更改为
{print”“}
并创建一个包含5行的文件运行脚本,然后编辑问题以显示输入文件和得到的输出。

在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>

除非在
xyz.csv
中有散乱的字符,否则这种情况不会发生。发布
文件xyz.csv的输出
使用$1时的输出是“naskar”,使用$0时的输出是“naskar,sahoo”以及下面文件中的所有其他行。我认为该文件有问题(“散乱字符”),因为Gawk命令在另一个文件中按预期工作。我如何识别并解决导致这种奇怪行为的问题?@EdMorton,谢谢。我认为你的推论是正确的。该文件似乎不是DOS文件。是否有任何方法可以直观或以其他方式确定文件是否为DOS?是否有任何方法可以直观或以其他方式确定文件是否具有DOS行结尾(供将来使用)?我不知道Windows工具,但在UNIX上,您可以在其上运行
file
命令或在其上运行
cat-Ev
。在Windows上,您可以安装
cygwin
或类似软件,以获得运行UNIX工具的UNIX环境。我更新了我的评论作为答案,因为这是你的问题。
@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$')\""
D:\TEMP>file.bat textfile.txt
CRLF: - False
CR: - False
LF: - True
D:\TEMP>