使用awk读取具有多个字符作为字段分隔符的CSV

使用awk读取具有多个字符作为字段分隔符的CSV,awk,Awk,我有一种CSV文件,使用|#|作为分隔符 $ cat /tmp/dd.csv animal|#|mysize|#|weight|#|adult|#|age|#|length 0|#|cat|#|S|#|8|#|False|#|3|#|30.0 1|#|dog|#|S|#|10|#|False|#|4|#|46.66666666666667 2|#|cat|#|M|#|11|#|False|#|5|#|63.333333333333336 3|#|fish|#|M|#|1|#|False|#|6

我有一种CSV文件,使用
|#|
作为分隔符

$ cat /tmp/dd.csv 
animal|#|mysize|#|weight|#|adult|#|age|#|length
0|#|cat|#|S|#|8|#|False|#|3|#|30.0
1|#|dog|#|S|#|10|#|False|#|4|#|46.66666666666667
2|#|cat|#|M|#|11|#|False|#|5|#|63.333333333333336
3|#|fish|#|M|#|1|#|False|#|6|#|80.0
4|#|dog|#|M|#|20|#|False|#|7|#|96.66666666666667
5|#|cat|#|L|#|12|#|True|#|8|#|113.33333333333334
6|#|cat|#|L|#|12|#|True|#|9|#|130.0
$
我想使用
awk
提取第3、1和4列

我明白了:

$ cat /tmp/dd.csv | awk -F'|#|' '{print $3 ";" $1 ";" $4}'
|weight|;animal|;|adult|
|S|;0|;|8|
|S|;1|;|10|
|M|;2|;|11|
|M|;3|;|1|
|M|;4|;|20|
|L|;5|;|12|
|L|;6|;|12|
它“几乎”起作用,但我只想:

weight;animal;adult
S;0;8
S;1;10
M;2;11
M;3;1
M;4;20
L;5;12
L;6;12

我建议GNU awk:

awk -F '\\|#\\|' -v OFS=';' '{print $3,$1,$4}' /tmp/dd.csv
必须转义特殊字符
|
。 输出:

重量;动物成人 s0;8. s1.10 M2.11 M3.1. M4.20 L5.12 L6.12
请参阅:

使用
|
作为
FS
之后的
$1
每隔一个字段跳过一次:

$ awk -F\| -v OFS=\; '{print $5,$1,$7}' file
输出:

weight;animal;adult
S;0;8
S;1;10
M;2;11
M;3;1
M;4;20
L;5;12
L;6;12

我更喜欢Cyrius解决方案,因为通常情况下,如果CSV有复杂的
| | | |
分隔符,这是因为我们希望在某些字段中出现
|
#
或两者都存在的情况下防止Pbs。@user3313834有意义,但您是否也考虑过如何处理包含
的数据s?如果分隔符是
| | |
,则根据术语的任何定义,它都不是CSV,因为它既不是逗号分隔的,也不是字符分隔的。
weight;animal;adult
S;0;8
S;1;10
M;2;11
M;3;1
M;4;20
L;5;12
L;6;12