使用AWK忽略嵌入空格

时间:2014-10-08 16:51:19

标签: csv awk space

我正在寻找一种使用awk打印特定字段的简单方法,同时允许在字段中嵌入空格。

示例:Field1 Field2 "Field Three" Field4

我希望能够做到等同于awk '{print $3}'但是将“Field Three”作为单个字段而不是两个字段。

更新:更具体地说,我需要获得后期不是3美元的领域,但是#3中的空间正在搞乱。 $ 3中引号之间的空格数是可变的。即使并非所有字段都被引用,我只是希望能够将引号之间的内容视为单个字段。因此,如果在引号之间,则将空格忽略为字段分隔符。

5 个答案:

答案 0 :(得分:1)

如果双引号始终存在,则可以执行此操作:

awk -F\" '{print $2}'

具体来说,我告诉awk这些字段用双引号分隔,此时您想要的部分可以作为字段2使用。

如果你需要进入后续字段,你可以在空格上拆分该行的其余部分并获得一个新数组,比如说F[]个字段,如下所示:

awk -F\" '{split($3,F," ");print $2,F[1],F[2]}' file

Field Three Field4 Field5

假设您的文件如下所示:

Field1 Field2 "Field Three" Field4 Field5 Field6

答案 1 :(得分:1)

基于this,在gawk中,您可以使用类似

的内容
awk 'BEGIN{FPAT = "([^ ]+)|(\"[^\"]+\")"}{print $3}' input.txt

输出:

"Field Three"

可能需要更多工作才能完全满足您的需求。

我认为它需要gawk 4 +,https://lists.gnu.org/archive/html/info-gnu/2011-06/msg00013.html

答案 2 :(得分:1)

解析CSV可能是一件棘手的事情。我喜欢使用具有适当CSV解析模块的语言。例如,使用ruby,解析给定的行,使用space作为列分隔符,并使用默认的双引号引用字符:

ruby -rcsv -ne 'row = CSV.parse_line($_, {:col_sep=>" "}); puts row[2]' <<END
Field1 Field2 "Field Three" Field4
END
Field Three

答案 3 :(得分:0)

Mark Setchell的答案很好,但如果你事先不知道你有多少嵌入式引用(并且它不再分隔在空格上),它将无效。

我一起攻击这个(显然可以改进):

gawk -v FIELD=2 '{ a=$ FIELD; if (substr(a, 0, 1) == "\"") { gsub(/^\"/, "", a); s=a; for (i = FIELD + 1; i <= NF; i++) { a=$ i; nbSub=gsub(/\"$/, "", a); s = s " " a; if (nbSub > 0) { break } } print(s) } }' <<<'allo "hello world" bar'

我建议使用除gawk以外的其他内容(或许可以查看使用shell的IFS变量解析字段?)。

附录:正如我上面所说,这不是真正适合这项工作的工具。例如,您可以使用-v FIELD =指定第一个字段,但它会根据AWK的分隔符计算字段(仍然计算嵌入的空格)。

答案 4 :(得分:0)

Mark Setchell的解决方案最适合我:

awk -F\" '{split($3,F," ");print $2,F[1],F[2]}' file