Bash - 如何提取第三个数字

时间:2015-03-31 14:13:54

标签: bash

在bash中如何从逗号分隔的列表中提取第四个元素,例如

"text",1244,258,8,NA,17,NA,2423

即。我想要号码8

如果更容易,请推荐我如何使用像perl这样的东西。

4 个答案:

答案 0 :(得分:2)

  • 您可以使用cut

     echo '"text",1244,258,8,NA,17,NA,2423' | cut -d, -f4
     8
    

    -d是设置字符分隔符的选项,-f是指定您感兴趣的字段。(您可以指定范围)

  • 或使用awk

    echo '"text",1244,258,8,NA,17,NA,2423' | awk -F, '{print $4}'
    8
    

顺便说一下,这是第四场而不是第三场。

答案 1 :(得分:1)

Perl解决方案:

perl -aF, -lne 'print $F[3]' input.txt

如果输入确实是包含带引号的逗号和换行符的CSV,请更好地使用Text::CSV

答案 2 :(得分:1)

这不是最强大的(会在双引号内打破换行符),但使用CSV解析器:

perl -MText::CSV -nE '
    BEGIN {$csv = Text::CSV->new()} 
    $csv->parse($_); 
    say +($csv->fields())[3];
' <<END

"hello,world",1244,258,8,NA,17,NA,2423
END
8

ruby​​附带标准库中的CSV解析器:

ruby -rcsv -ne 'CSV.parse($_) {|f| puts f[3]}'

答案 3 :(得分:0)

我为什么人们推荐bash本身的外部工具而感到茫然 - 除非正确处理文本字符串包含逗号的情况很重要,否则不需要无论是perl,awk还是任何其他类似的工具,只需处理一行,内部处理bash的效率会更高。

IFS=, read _ _ _ target _ <<<'"text",1244,258,8,NA,17,NA,2423'
echo "$target"

......或类似地:

IFS=, read -a items <<<'"text",1244,258,8,NA,17,NA,2423'
echo "${items[3]}" # first item is 0

现在,如果您需要在文本字段中处理逗号和引号,那么现在是时候提取CSV解析器了。 Python在标准库中包含一个,因此可以确保它适用于所有现代系统:

python -c 'import sys, csv; print csv.reader(sys.stdin).__iter__().next()[3]' \
  <<<'"text",1244,258,8,NA,17,NA,2423')