awk printf 的意外输出

Jim*_*Jim 3 osx awk csv

我有以下 csv 文件:

$ cat mycsv.csv 
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","jim@gmail.com","A","6.0.12”,”A”,”N”  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","jim@gmail.com","A","6.0.12”,”A”,”N”  
"1/30/2017 11:14:55 AM","I","M","k6.0.1","E","jim","JimK","JIM","jim@gmail.com","A","6.0.12”,”A”,”N”  
Run Code Online (Sandbox Code Playgroud)

为什么以下不打印所有行?

$awk -F "," '{printf}' mycsv.csv    
 ","M","k6.0.1","E","jim","JimK","JIM","jim@gmail.com","A","6.0.12”,”A”,”N””  

$awk -F "," '{printf $0}' mycsv.csv 
 ","M","k6.0.1","E","jim","JimK","JIM","jim@gmail.com","A","6.0.12”,”A”,”N””  
Run Code Online (Sandbox Code Playgroud)

两者都应该打印所有行吗?我究竟做错了什么?

Sté*_*las 10

的第一个参数printf,无论是 Cprintf()还是printf实用程序或awk'sprintf()都是必需的1并且是格式

你要:

awk '{printf "%s", $0}'
Run Code Online (Sandbox Code Playgroud)

这里。如果您不想要输出记录分隔符,您还可以执行以下操作:

awk -v ORS= '{print}' < mycsv.csv
Run Code Online (Sandbox Code Playgroud)

甚至:

awk -v ORS= 1 < mycsv.csv
Run Code Online (Sandbox Code Playgroud)

{print}是默认操作,true是默认条件,但您需要指定至少一个操作或条件,1是表示true 的一种方式)。

虽然在这里,tr就足够了:

tr -d '\n' < mycsv.csv
Run Code Online (Sandbox Code Playgroud)

或者,如果您仍然想要一个尾随换行符,以便输出仍然是文本:

paste -sd '\0' mycsv.csv
Run Code Online (Sandbox Code Playgroud)

您的文件似乎也具有 Microsoft 样式的 CRLF 行分隔符,因此您可能还想删除 CR 字符:

tr -d '\r\n' < mycsv.csv
Run Code Online (Sandbox Code Playgroud)

或仅与CRLF序列awk实现,支持多于单字符RS(其包括gawkmawk但不MACOS awk):

awk -v RS='\r\n' -v ORS= 1 < mycsv.csv
Run Code Online (Sandbox Code Playgroud)

或者:

awk -v RS='\r?\n' -n ORS= 1 < mycsv.csv
Run Code Online (Sandbox Code Playgroud)

可以\r选择处理 Unix 或 MS-DOS 行分隔符。

或者先使用dos2unix或 之类的东西d2u将文件转换为 Unix 格式。

笔记

1实用程序的标准规范中printf需要格式参数 to 。输入和省略它会导致错误。在 中,它等效于并从原始实现派生而来(如 on ),它等效于(几乎没有用,因为它仍然被视为一种格式,如果包含字符,您仍然会收到错误)。awkgawkmawkbusybox awkprintf ""awkmacOSprintf $0$0%