如何获取分隔字符串中的字段数?

时间:2013-08-21 07:26:42

标签: bash shell cut

鉴于以下数据:

 field1;field2;field3;field4;

如何获取此字符串中的字段数? 例如,对于这种情况,该命令应该返回 4

实际上,我在每一行中都没有相同数量的内容,但无论如何我都需要将它们全部归还。一旦我设法计算了字段的数量,我还将设法制作一个循环以获取所有字段。

5 个答案:

答案 0 :(得分:11)

你可以说:

$ echo "field1;field2;field3;field4;" | grep -o ";" | wc -l
4

可替换地,

$ tr -dc ';' <<< "field1;field2;field3;field4;" | wc -c
4

编辑:为了遍历字段,您可以说:

$ IFS=';' read -ra field <<< "field1;field2;field3;field4;"
$ for i in "${field[@]}"; do echo $i; done
field1
field2
field3
field4

答案 1 :(得分:9)

使用cut不是推荐的命令,因为它可以使用awk在一行中完成。

例如

data='field1;field2;field3;field4;'
echo $data|awk -F';' '{print NF}'

实际上上面会返回5,因为在给定数据的末尾有“分号”,因此linux awk假设最后一个字段为空。

但是如果预计会有这样的话,那么你可以使用下面的命令减去1。

echo $data|awk -F';' '{print NF-1}'

说明: awk中的-F选项用于分隔符,在这种情况下它是分号(用单引号括起来) NF表示字段数。

答案 2 :(得分:5)

Pure bash解决方案:

myStr='field1;field2;field3;field4;'
x="${myStr//[^;]}"                   # remove everything but the delimiter ';'
echo "${#x}"                         # get the length - outputs 4

答案 3 :(得分:1)

我提供的选项仍然没有错误或操纵。

j=0
i=1

while [ "$j" ]
do 
    j="$(cat dataFile.txt | cut -d[delimiter] -f$i)" 
    i="$(($i+1))"
done 

echo "$(($i-2))"

我初始化变量$j以保存结果,只要结果存在,循环就会计算每次运行。 cut一直运行到场外2点,解释我的$(($i-2))声明。

在cut -d之后放置数据文件的分隔符 我使用逗号分隔我的字段,所以我的实际代码有: cut -d,-f $ i

我希望这是有道理的。

答案 4 :(得分:-1)

#!/bin/bash
DATA="field1;field2;field3;field4;"
# save IFS
OLDIFS=$IFS
# set new IFS
IFS=";"
# set DATA as position parameters
set -- ${DATA//\*/\\*}
# simply get parameter count
echo "Fields: $#"
# restore IFS 
IFS=$OLDIFS