如何使用 AWK 使用分隔符将行内容分成多行

如何使用 AWK 使用分隔符将行内容分成多行

给定这样的输入:

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

使用bashcsvformat来自csvkit将字段分隔符从逗号更改为换行符的集合:

$ csvformat -D $'\n' file
field1
field2
field3
field4

这是假设输入的fileCSV 格式正确。这也可以正确处理嵌入的逗号:

$ cat file
"field,1",field2,field3,field4
$ csvformat -D $'\n' file
field,1
field2
field3
field4

相关内容