web-dev-qa-db-ja.com

区切られた文字列のフィールド数を取得するにはどうすればよいですか?

次のデータが与えられます:

 field1;field2;field3;field4;

この文字列のフィールド数を取得するにはどうすればよいですか?たとえば、この場合、コマンドは4を返す必要があります。

実は、各行の内容は同じではありませんが、とにかく全部返却する必要があります。フィールドの数を数えることができたら、それらすべてを取得するためにループを作成することもできます。

8
DoesJohnDo

あなたは言うことができます:

$ 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
14
devnull

カットの使用は、awkを使用して1行で実行できるため、ジョブを実行するための推奨コマンドではありません。

例:.

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

与えられたデータでは最後に「セミコロン」があるため、実際には上記は5を返します。したがって、linuxawkは最後のフィールドが空であると想定します。

しかし、これがこのようになると予想される場合は、以下のコマンドを使用して1を引くことができます。

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

説明:awkの-Fオプションは区切り文字用です。この場合はセミコロン(一重引用符で囲まれています)です。NFはフィールドの数を意味します。

12
Shashilpi

純粋な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

これが理にかなっていることを願っています。

1
David Pena