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