使用awk读取具有多个字符作为字段分隔符的CSV
我有一种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
|#|
作为分隔符
$ 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