识别带引号空格的列

时间:2015-09-18 07:47:09

标签: bash awk

我有一个包含以下内容的文件:

"aaa" "aaa bbb" "c cc  c" "ddd"

我正在寻找能够显示指定列的命令。

我尝试使用:

awk '{print $1}'

但是如果在“c cc c”这样的双层空间中存在空格字符,则它无法正常工作。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您可以在 gnu-awk 中使用FPAT变量来根据正则表达式打破列:

s='"aaa" "aaa bbb" "c cc  c" "ddd"'

awk -v FPAT='"[^"]+"' '{for (i=1; i<=NF; i++) printf "Field %d:: <%s>\n", i, $i}' <<< "$s"
Field 1:: <"aaa">
Field 2:: <"aaa bbb">
Field 3:: <"c cc  c">
Field 4:: <"ddd">

-v FPAT='"[^"]+"'会将每个字段值设置为2个双引号。

答案 1 :(得分:1)

使用传统awk

的解决方案
echo '"aaa" "aaa bbb" "c cc  c" "ddd"' | 
awk -c -F "^\"|\"[ \t]+\"|\"$" '{
    for(i=2; i<=NF-1; i++) 
        printf "\"%s\"\n", $i 
}'

你得到:

"aaa"
"aaa bbb"
"c cc  c"
"ddd"

答案 2 :(得分:0)

Perl救援!使用Text::CSV模块:

perl -MText::CSV -lwe '
    my $csv = Text::CSV->new({sep_char => " "}) or die Text::CSV->error_diag;
    open my $FH, "<", "input.txt" or die $!;
    while (my $row = $csv->getline($FH)) {
        print $row->[3];
    }'