在bash中如何从逗号分隔的列表中提取第四个元素,例如
"text",1244,258,8,NA,17,NA,2423
即。我想要号码8
。
如果更容易,请推荐我如何使用像perl这样的东西。
答案 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)
答案 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')