我有以下 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
(其包括gawk
与mawk
但不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 ),它等效于(几乎没有用,因为它仍然被视为一种格式,如果包含字符,您仍然会收到错误)。awk
gawk
mawk
busybox
awk
printf ""
awk
macOS
printf $0
$0
%