次のデータが与えられます:
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
カットの使用は、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はフィールドの数を意味します。
純粋な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
これが理にかなっていることを願っています。