逐个剪切变量到它的字段

时间:2013-02-26 06:49:59

标签: linux bash

我有一个像这样的变量(Tab分离):

“a b c d”

我想逐个读取字段,但问题是字段数不固定,我的意思是变量可能不包含字段或3个字段或100个字段或更多字段。

我不知道我能处理它的最好方法。 任何人都可以向我展示一个好方法吗?

5 个答案:

答案 0 :(得分: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中的字词。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:1)

假设您的变量Z包含“a b c d”。您可以创建一个数组变量,从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中的字符时完成的。如果需要,您可以更改字符。

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

答案 4 :(得分: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
>