awk将输入引号捕获为单个字段
我有一个数据集,第一列以引号内的名称开头。是否可以将名称捕获为单个字段awk将输入引号捕获为单个字段,awk,field,quotes,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 "Horn
"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
awk'{name=$1;for(i=2;i您可以使用“
作为输入字段分隔符。这将为$1分配一个空字段,将全名分配给$2,将行的其余部分分配给$3
$ awk 'BEGIN{FS="\""}{print $2}' < test.dat
$awk'开始{FS=“\”“}{print$2}”
马自达RX4
马自达RX4 Wag
达特桑710
大黄蜂4路
大黄蜂运动
勇敢的
除尘器360
美塞苔丝240D
水星230
美塞苔丝280
您可以使用“
作为输入字段分隔符。这会将空字段分配给$1,将全名分配给$2,将行的其余部分分配给$3
$ awk 'BEGIN{FS="\""}{print $2}' < test.dat
$awk'开始{FS=“\”“}{print$2}”
马自达RX4
马自达RX4 Wag
达特桑710
大黄蜂4路
大黄蜂运动
勇敢的
除尘器360
美塞苔丝240D
水星230
美塞苔丝280
结果
Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240D
Merc 230
Merc 280
马自达RX4
马自达RX4 Wag
达特桑710
大黄蜂4路
大黄蜂运动
勇敢的
除尘器360
美塞苔丝240D
水星230
美塞苔丝280
结果
Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240D
Merc 230
Merc 280
马自达RX4
马自达RX4 Wag
达特桑710
大黄蜂4路
大黄蜂运动
勇敢的
除尘器360
美塞苔丝240D
水星230
美塞苔丝280
为了让它尽可能短:
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
为了让它尽可能短:
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
正在按内容进行拆分(FPAT)仅在GNU awk中?不,这是我询问它是否仅在GNU awk中的直接方式。它不受Ubuntu附带的版本mawk的支持。这是一个很好的功能;切换到GNU awk的另一个原因。非常简洁,但模糊:NF=1
是实际的awk程序,而FPAT='[^]+“
是一个伪文件名,用于定义FPAT
变量(等效:awk-v FPAT='[^”]+''NF=1'test.dat
)。模式NF=1
实际上相当于操作{print$1}
:它告诉awk
将字段数限制为1,从而将$0
替换为$1
;由于模式NF=1
(这里正好是一个赋值)的结果是1(读取:true),并且没有相关操作,因此默认情况下是打印(修改的)输入行,在这种情况下有效地打印$1
。不是使用特定于gawk
的功能,而是解决方案的构造使其变得模糊(但简洁)。事实上,甚至还有一个更短的POSIX兼容解决方案使用相同的逻辑:awk'$0=$2'FS=\”
(17个字符)或者,更简短地说,使用-F
:awk-F\'“$0=$2'
(16个字符)一开始我很难理解你的解决方案,所以我想我的解释可能会帮助其他人。我给了你-1,因为你没有在你的帖子中写关于FPAT
的限制。据我所知,这不仅是gnu awk
,而且至少需要版本4.x
是按内容划分的(FPAT)仅在GNU awk中?不,这是我询问它是否仅在GNU awk中的直接方式。它不受Ubuntu附带的版本mawk的支持。这是一个很好的功能;切换到GNU awk的另一个原因。非常简洁,但模糊:NF=1
是实际的awk程序,而FPAT='[^]+“
是一个伪文件名,用于定义FPAT
变量(等效:awk-v FPAT='[^”]+''NF=1'test.dat
)。模式NF=1
实际上相当于操作{print$1}
:它告诉awk
将字段数限制为1,从而将$0
替换为$1
;由于模式NF=1
(这里正好是一个赋值)的结果是1(读取:true),并且没有相关操作,因此默认情况下是打印(修改的)输入行,在这种情况下有效地打印$1
。不是使用特定于gawk
的功能,而是解决方案的构造使其变得模糊(但简洁)。事实上,甚至还有一个更短的POSIX兼容解决方案使用相同的逻辑:awk'$0=$2'FS=\”
(17个字符)或者,更简短地说,使用-F
:awk-F\'“$0=$2'
(16个字符)一开始我很难理解你的解决方案,所以我想我的解释可能会帮助其他人。我给了你-1,因为你没有在你的帖子中写关于FPAT
的限制。据我所知,这不仅是gnu awk
,而且至少需要版本4.x
+1;一个兼容POSIX的解决方案;更简洁的重新表述关于:awk-F\“{print$2}”test.dat
+1;兼容POSIX的解决方案;更简洁的重新表述:awk-F\“{print$2}”test.dat