awk捕获输入引号作为单个字段

时间:2014-05-14 00:44:34

标签: awk field quotes

所以我有这个数据集,第一列以引号内的名字开头。是否可以将名称捕获为单个字段?

"Mazda RX4" 21 6 160 110 3.9 2.62 16.46 0 1 4 4
"Mazda RX4 Wag" 21 6 160 110 3.9 2.875 17.02 0 1 4 4
"Datsun 710" 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
"Hornet 4 Drive" 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
"Hornet Sportabout" 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2
"Valiant" 18.1 6 225 105 2.76 3.46 20.22 1 0 3 1
"Duster 360" 14.3 8 360 245 3.21 3.57 15.84 0 0 3 4
"Merc 240D" 24.4 4 146.7 62 3.69 3.19 20 1 0 4 2
"Merc 230" 22.8 4 140.8 95 3.92 3.15 22.9 1 0 4 2
"Merc 280" 19.2 6 167.6 123 3.92 3.44 18.3 1 0 4 4

请注意,有时名称是单个字段(如“Valiant”),有时2个(如“Mazda RX4”或3个“Mazda RX4 Wag”)

所以基于字段的数量,我想出了这个awk代码,它按照我的意愿工作,但是我想知道是否有其他系统方法可以这样做?

awk '{name=$1; for (i=2; i<=NF-11; i++) name=name " " $i; printf "%s\n", name}' data/mtcars.dat | head
Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240D
Merc 230
Merc 280

3 个答案:

答案 0 :(得分:4)

您可以使用"作为输入字段分隔符。这会将一个空字段分配给$ 1,全名分配给$ 2,其余部分分配给$ 3.

$ awk 'BEGIN{FS="\""}{print $2}' < test.dat
Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240D
Merc 230
Merc 280

答案 1 :(得分:1)

只是为了让它尽可能短:

awk -F\" '$0=$2' file
Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240D
Merc 230
Merc 280

或者更强大一些:

awk -F\" '{$0=$2}1' file

答案 2 :(得分:0)

awk NF=1 FPAT='[^"]+'

结果

Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240D
Merc 230
Merc 280