1

我有一个像这样的变量(制表符分隔):

“A B C D”

我想逐个读取字段,但问题是字段数不固定,我的意思是变量可能不包含字段或 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用 in 中的每个元素循环遍历单词in $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

...或在shell脚本中...

$ 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

假设您有包含“abc d”的变量 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

只要遇到 shell 变量 IFS 中的字符,就会进行分词。您可以根据需要更改字符。

awk请注意,这种拆分方法是在 shell 内部完成的,因此它比生成或外部程序要快得多cut,但它在 shell 之间的可移植性也较差。

于 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 回答