1

私はこのような変数を持っています(タブ区切り):

"あいうえお"

フィールドを1つずつ読みたいのですが、フィールドの数が固定されていないという問題があります。つまり、変数にフィールドが含まれていないか、3つのフィールドまたは100以上のフィールドが含まれている可能性があります。

私はそれを処理するための最良の方法を知りません。誰かが私に良い方法を教えてもらえますか?

4

5 に答える 5

3

これは私がこれまでに見つけたものです:

$ 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ます。

于 2013-02-26T07:03:49.463 に答える
2

コマンドを使用し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
于 2013-02-26T13:16:50.277 に答える
1

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
于 2013-02-26T06:54:40.927 に答える
1

「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プログラムよりもはるかに高速ですが、シェル間での移植性も低くなります。

于 2013-02-26T07:16:30.007 に答える
0
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
> 
于 2013-02-26T06:52:44.097 に答える