Arrays 用awk分配ksh/bash数组
我尝试将给定的行转换为数组,例如,这行: 我的第一个世界 到以下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
[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,正如我预期的那样,我已被阻止,将接受您的回答,感谢您的回复!