Awk 目瞪口呆的打印令人费解的行为
csv文件有两列。 下面的代码输出整个文件(所有行和两列之间用逗号分隔) 但是,下面的代码只输出一个值,即。第一行的第1列: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),但
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>