私はこのような変数を持っています(タブ区切り):
"あいうえお"
フィールドを1つずつ読みたいのですが、フィールドの数が固定されていないという問題があります。つまり、変数にフィールドが含まれていないか、3つのフィールドまたは100以上のフィールドが含まれている可能性があります。
私はそれを処理するための最良の方法を知りません。誰かが私に良い方法を教えてもらえますか?
これは私がこれまでに見つけたものです:
$ x=$'a a\t*\t c\td\te'
$x
タブ区切りのフィールドを含む私のテスト変数です。
$ IFS=$'\t'
単語はタブのみで区切られ、スペースや改行では区切られません。
$ set -f
グロブを無効にします。
$ for i in $x; do echo "$i"; done
a a
*
c
d
e
$x
の各要素での単語をループし$i
ます。
コマンドを使用しread
ます。
IFS=$'\t' read -a fields <<< $'a b\tc d\te f'
for f in "${fields[@]}"; do
echo "$f"
done
出力は
a b
c d
e f
cut -f#
そのように使用します:
$ cat string
a b c d
$ cut -f1 string
a
$ cut -f2 string
b
$ cut -f3 string
c
$ cut -f4 string
d
...またはシェルスクリプトで..。
$ cat test.sh
#!/bin/sh
var="a b c d"
echo $var | cut -d' ' -f1
echo $var | cut -d' ' -f2
echo $var | cut -d' ' -f3
echo $var | cut -d' ' -f4
$ ./test.sh
a
b
c
d
... または多分 ...
$ cat test2.sh
#!/bin/sh
var="a b c d"
SAVEIFS=$IFS
IFS=$(echo -en "\t")
for v in $var
do
echo $v
done
IFS=$SAVEIFS
$ ./test2.sh
a
b
c
d
「abcd」を含む変数Zがあるとします。次のように、Zから分割された配列変数を作成できます。
ZA=( $Z )
次に、個々の要素${ZA[0]}
に${ZA[1]}
などとしてアクセスできます。
次に、変数の各部分に対していくつかの操作を実行できます。
for part in ${ZB[@]}; do
echo $part # or whatever you want to do with it
done
for
これは、ステートメントで単語分割をより直接的に利用できるため、もう少し構造化されたアプローチです。
for part in $Z; do
echo $part # or whatever you want to do with it
done
単語の分割は、シェル変数IFSの文字が検出された場合に実行されます。必要に応じて文字を変更できます。
この種の分割アプローチはシェル内で行われるため、スポーンawk
や外部cut
プログラムよりもはるかに高速ですが、シェル間での移植性も低くなります。
echo $variable|awk '{print $1}' #will print the first field
echo $variable|awk '{print $2}' #will print the second field
echo $variable|awk '{print $NF}' #will print the last field
echo $variable|awk '{print NF}' #will print the number of fields
以下でテスト済み:
> setenv var "a b c d"
> echo $var|awk '{print $1}'
a
> echo $var | awk '{print $2}'
b
> echo $var | awk '{print $NF}'
d
> echo $var | awk '{print NF}'
4
>