首页 > 解决方案 > 使用 awk 读取具有多个字符作为字段分隔符的 CSV

问题描述

我有一种 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

标签: awk

解决方案


我建议使用 GNU awk:

awk -F '\\|#\\|' -v OFS=';' '{print $3,$1,$4}' /tmp/dd.csv

有必要对特殊字符进行转义|。输出:

重量;动物;成人
S;0;8
S;1;10
M;2;11
M;3;1
M;4;20
L;5;12
L;6;12

请参阅:8 个强大的 Awk 内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR


推荐阅读