2011-07-07 26 views
1

我想给定线变换到一个数组,例如下面这行:分配KSH/bash的阵列使用awk

我的第一个\ t \ tHello世界

以下ksh的/ bash的数组:

[0]="My first" 
[1]="" 
[2]="Hello world" 

我的代码:

TAB=`printf '\011'` 

query() 
{ 
    echo "$1"|awk -F"$TAB" ' 
     { 
      for(i = 0; i < NF; i++) 
       QueryArray[i]=$i 
     }'; 
} 

line=`head -n 1 myFile` 
typeset -a QueryArray; 
query "$line" 
echo "Array length: ${#QueryArray[*]}" 
echo "- " ${QueryArray[0]} 
echo "- " ${QueryArray[1]} 
echo "- " ${QueryArray[2]} 

但不起作用,有什么建议?

谢谢。

回答

1

我有一个旧的ksh不理解$'ANSI'字符串,所以:

str2array() { 
    typeset arrayname=$1 
    typeset IFS=$2 
    shift 2 
    eval "set -A $arrayname \$*" 
} 

s="Hello  World"  # tabs entered literally with "Ctrl-V tab" 
str2array myarray " " "$s"  # another literal tab as 2nd parm 
typeset -i i=0 
while [[ $i -lt ${#myarray[@]} ]]; do 
    printf "%d\t%s\n" $i "${myarray[$i]}" 
    i=$((i+1)) 
done 

对于bash:

str2array() { 
    local arrayname=$1 
    local IFS=$2 
    shift 2 
    eval "$arrayname=(\$*)" 
} 

s=$'hello\t\tworld' 
str2array myarray $'\t' "$s" 
for ((i=0; i < ${#myarray[@]}; i++)); do 
    printf "%d\t%s\n" $i "${myarray[$i]}" 
done 

我得到了同样的结果ar Arnaud对David的评论:用“word \ t \ tword”,中间字段被丢弃。我没有看到使用不同的分隔符如冒号。

ksh的

空白解释
参数和命令替换后, 置换结果扫描字段分隔符字符 (在IFS发现的那些),并分成不同的参数,其中 这样的字符是找到。显式空参数(“”)或 ('')被保留。 将删除隐式空参数(那些不带值的参数导致的 )。

的bash

分词
... shell对IFS中的每个字符作为分隔符,并拆分 结果其他扩展到这些字符的单词。如果IFS 没有设置,或者它的值是完全<space><tab><newline>,在默认情况下, 那么<space><tab><newline>在开始和以前扩张的结果 年底被忽略序列,任何 的IFS字符序列不在开始或结束时服务于 分隔词。如果IFS的值不是默认值,那么 空格字符空格和制表符的字符序列在 开始和结尾的字符处被忽略,只要IFS的空格字符为 (IFS空白字符)。 中的任何字符不是IFS空格的IFS,以及任何相邻的IFS空格 字符会分隔一个字段。 IFS空白字符序列 也被视为分隔符。如果IFS的值为空,则不会发生分词 分裂。

+0

似乎是我被封锁,会接受你的答案,谢谢你的回复! –

1
query() 
{ 
    IFS=$'\t' 
    ind=0  
    for i in $1 
     do 
      QueryArray[$ind]=$i 
      let "ind+=1" 
     done 
    unset IFS 

} 

declare -A QueryArray; 
query "Hello  World" #Hello\t \tWorld 
echo "Array length: ${#QueryArray[*]}" 
echo "- " ${QueryArray[0]} 
echo "- " ${QueryArray[1]} 
echo "- " ${QueryArray[2]} 
+0

在KSH中不起作用... –

1

不中KSH工作。

您需要使用typeset,而不是declare,并使用function关键字。否则,satyajit的答案工作得很好。

Kornshellified你...

function query 
{ 
    IFS=$'\t' 
    ind=0 
    for i in $1 
    do 
     QueryArray[$ind]=$i 
     let "ind+=1" 
    done 
    unset IFS 

} 

typeset -a QueryArray #Actually this is optional in Kornshell 
query "Hello    World" #Hello\t \tWorld 

# What the heck? Might as well go all Korn: print vs. echo 
print "Array length: ${#QueryArray[*]}" 
print -- "- ${QueryArray[0]}" 
print -- "- ${QueryArray[1]}" 
print -- "- ${QueryArray[2]}" 
+0

只有当你有一个字符在2'\ t \ t'之间时才起作用,如果你有'Hello \ t \ tWorld',它只会返回一个数组长度2,而不是3,因为我预计 –