我正在寻找一种使用awk打印特定字段的简单方法,同时允许在字段中嵌入空格。
示例:Field1 Field2 "Field Three" Field4
我希望能够做到等同于awk '{print $3}'
但是将“Field Three”作为单个字段而不是两个字段。
更新:更具体地说,我需要获得后期不是3美元的领域,但是#3中的空间正在搞乱。 $ 3中引号之间的空格数是可变的。即使并非所有字段都被引用,我只是希望能够将引号之间的内容视为单个字段。因此,如果在引号之间,则将空格忽略为字段分隔符。
答案 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