【问题标题】:Recognizing columns with quoted spaces [duplicate]识别带引号空格的列[重复]
【发布时间】:2015-12-15 06:46:52
【问题描述】:

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

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

我正在寻找可以显示指定列的命令。

我尝试使用:

awk '{print $1}'

但如果双队列中有空格字符,如“c cc c”,它就不能正常工作。

提前感谢您的帮助。

【问题讨论】:

  • 那么您认为 awk 如何识别列?
  • 嗨 Karoly,我知道它是如何工作的(它使用空格)并且我知道可以定义自己的字段分隔符。我不知道如何定义这样的分隔符。
  • 卡罗莉,别那么刻薄。粘贴到谷歌的链接你可以回答关于 stackoverflow 的所有问题,但这对任何人都没有帮助。
  • 这就是为什么我们期望通过简单的谷歌搜索无法回答的质量问题。创建重复的问题对任何人都没有帮助......作为旁注,搜索是一项非常重要和有用的技能,所有初学者都必须学习。向某人展示如何找到东西没有任何意义。

标签: bash awk


【解决方案1】:

您可以在 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 个双引号之间。

【讨论】:

  • 不错的一个。尤其是FPAT 变量。
  • 感谢您的帮助! :-)
【解决方案2】:

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];
    }'

【讨论】:

    【解决方案3】:

    使用传统awk的解决方案

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

    你得到:

    “啊” “啊啊啊啊” “cccc” “ddd”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-17
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多