BASH | 如何获取bash中一行的字段数(使用剪切?)

鉴于以下数据:

field1;field2;field3;field4; 

如何获得这一行的字段数? 例如,这个命令应该在这里给出4

实际上,每一行我没有相同数量的内容,但我需要全部归还。 一旦我设法计算字段的数量,我也将设法做一个循环来获取它们。

(操作系统:Ubuntu 13.04)

预先感谢您的帮助。

Solutions Collecting From Web of "BASH | 如何获取bash中一行的字段数(使用剪切?)"

你可以说:

 $ 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 

使用剪切不是推荐的命令来完成这项工作,因为它可以使用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//[^;]}" echo "${#x}" # 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))声明。

把你的数据文件的分隔符放在剪切后-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