13

给定以下数据:

 field1;field2;field3;field4;

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

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

4

5 回答 5

21

你可以说:

$ 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
于 2013-08-21T07:31:05.973 回答
18

不推荐使用 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 表示字段数。

于 2013-08-21T08:53:05.847 回答
7

纯 bash 解决方案:

myStr='field1;field2;field3;field4;'
x="${myStr//[^;]}"                   # remove everything but the delimiter ';'
echo "${#x}"                         # get the length - outputs 4
于 2013-08-21T07:46:45.003 回答
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

我希望这是有道理的。

于 2014-05-24T05:39:03.313 回答
-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
于 2016-03-18T17:51:59.543 回答