给定以下数据:
field1;field2;field3;field4;
如何获取此字符串中的字段数?例如,对于这种情况,命令应该返回4。
实际上,我在每行中没有相同数量的内容,但无论如何我都需要返回它们。一旦我设法计算了字段的数量,我还将设法进行循环以获取所有字段。
你可以说:
$ 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
不推荐使用 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 表示字段数。
纯 bash 解决方案:
myStr='field1;field2;field3;field4;'
x="${myStr//[^;]}" # remove everything but the delimiter ';'
echo "${#x}" # get the length - outputs 4
我提供的选项仍然没有错误或操纵。
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
我希望这是有道理的。
#!/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