Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 用awk分配ksh/bash数组_Arrays_Bash_Awk_Ksh - Fatal编程技术网

Arrays 用awk分配ksh/bash数组

Arrays 用awk分配ksh/bash数组,arrays,bash,awk,ksh,Arrays,Bash,Awk,Ksh,我尝试将给定的行转换为数组,例如,这行: 我的第一个世界 到以下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 }'; } l

我尝试将给定的行转换为数组,例如,这行:

我的第一个世界

到以下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]}
TAB=`printf'\011'`
查询()
{
回音“$1”| awk-F“$TAB”
{ 
对于(i=0;i
但是不行,有什么建议吗

谢谢

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]}
在KSH中不起作用

您需要使用
排版
而不是
声明
,并使用
函数
关键字。否则,我们的答案就行了

Kornshellized为你准备的

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]}"

我有一个旧的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
str2array(){
本地阵列名称=$1
本地IFS=2美元
班次2
评估“$arrayname=(\$*)”
}
s=$'hello\t\tworld'
str2array myarray$'\t'$s“
对于((i=0;i<${myarray[@]};i++);做
printf“%d\t%s\n“$i”${myarray[$i]}”
完成

我得到的结果与Arnaud对David的评论相同:使用“word\t\tword”,中间字段被删除。我看不出有不同的分隔符,比如冒号

ksh

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

猛击

分词
... shell将IFS的每个字符视为分隔符,并拆分 其他扩展为这些字符上的单词的结果。如果 未设置,或其值正好是默认值
, 然后在开头和结尾处依次显示
忽略先前展开的结束结果,并且 不在开头或结尾的IFS字符序列用于 划出单词。如果IFS的值不是默认值,则 空格字符和制表符的序列在 单词的开头和结尾,只要空格字符是 在IFS的值中(IFS空白字符)。任何字符 不是IFS空格的IFS,以及任何相邻的IFS空格 字符,分隔字段一系列IFS空格字符 也被视为分隔符。如果IFS的值为null,则没有单词 发生分裂


只有当您的字符介于2
\t\t
之间时,它才有效;如果您的字符介于2
之间,则它将只返回数组长度2,而不是3,正如我预期的那样,我已被阻止,将接受您的回答,感谢您的回复!