给定这样的输入:
field1,field2,field3,field4
我想得到这样的输出
field1
field2
field3
field4
我怎样才能用 awk 做到这一点?
答案1
Awk 的惯用方式可能是
awk 'BEGIN{FS=","; OFS="\n"} {$1=$1} 1'
或同等地
awk '{$1=$1} 1' FS=, OFS='\n'
just{$1=$1}
强制使用新的分隔符重新评估记录OFS
,并且1
触发默认print
操作。如果您愿意,您可以使用其他表达式(例如NF += 0
)来强制重新评估 - 这是一个偏好问题。
一个快速而肮脏的方法是
awk -vRS=, 1
(或awk 1 RS=,
) 它将每个逗号分隔的单词视为一个完整的记录,并使用默认的换行记录分隔符输出它们。
答案2
使用t将逗号转换为换行符:
echo "field1,field2,field3,field4" | tr "," "\n"
这可能比使用更快awk
,但如果你坚持的话,你可以这样做:
echo "field1,field2,field3,field4" | awk '{gsub(",","\n");print}'
来自GNU awk 文档:
gsub(正则表达式,替换[,目标])
搜索目标它可以找到的所有最长、最左边、不重叠的匹配子字符串,并用替换来替换它们。 gsub() 中的“g”代表“global”,这意味着到处替换。
答案3
使用bash
和csvformat
来自csvkit
将字段分隔符从逗号更改为换行符的集合:
$ csvformat -D $'\n' file
field1
field2
field3
field4
这是假设输入的file
CSV 格式正确。这也可以正确处理嵌入的逗号:
$ cat file
"field,1",field2,field3,field4
$ csvformat -D $'\n' file
field,1
field2
field3
field4