鉴于以下数据:
field1;field2;field3;field4;
如何获取此字符串中的字段数? 例如,对于这种情况,该命令应该返回 4 。
实际上,我在每一行中都没有相同数量的内容,但无论如何我都需要将它们全部归还。一旦我设法计算了字段的数量,我还将设法制作一个循环以获取所有字段。
答案 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