我有一个问题,
实际上我有一个存储数据的文本文件:第一行中有一个数字表示观察次数,第二行中有一个变量表示变量数,第三行中有一个数字表示数据矩阵:每一行代表一个个体,每一列代表一个变量。
例如,我的数据库由3个观察值和4个变量组成,如下所示:
3
4
8 5 6 4 1
7 6 1 5 2
4 8 2 7 2
最后一列代表每个观察的类别
我正在寻找一个给我3个(变量数-1)数据库的程序,第一个由第一个变量和类组成,第二个由前两个变量和类组成,第三个由第一个组成三个变量和类的最后一列,因此我的新数据库必须是跟随其后的文本格式(第一行:观察值的数量,第二行:变量的数量),第一个文本文件将是:
3
1
8 1
7 2
4 2
第二个文本文件将是:
3
2
8 5 1
7 6 2
4 8 2
第三个文本文件将是:
3
3
8 5 6 1
7 6 1 2
4 8 2 2
我有一个程序,每次都会删除一个变量,我想对它进行中间化处理,以便它给出上面解释的内容
该程序是:
#!/bin/sh
#script.sh
#initialisation du compteur
i=0
index=0
nb0=0
nbV=0
tab[1]=0
#fichier="test.txt"
fichier=$1
old_IFS=$IFS
#découper les lignes en fonction du formatage du fichier texte
#pour un autre formatage, modifier l'environnement de la commande read
#en adaptant l'IFS(Internal Field Separator)
while IFS='$\n' read -r ligne; do
#traitement des lignes 1 et 2
if [ "$i" -eq 0 ]; then
echo "nbO : $ligne"
nbO=$ligne
elif [ "$i" -eq 1 ]; then
echo "nbV: $ligne"
nbV=$ligne
while [ "$index" -lt "$nbV" ]
do
echo $nbO >> Output_$(($index+1)).txt
index=$(($index+1))
done
index=0
while [ "$index" -lt "$nbV" ]
do
echo $(($nbV-1)) >> Output_$(($index+1)).txt
index=$(($index+1))
done
else
index=0
IFS=' '
read -a array <<<"$ligne"
#récuperer le nombre de variables à partir
#de la taille du tableau contenant les variables
nbV=${#array[*]}
while [ "$index" -lt "$nbV" ]
do
#supprimer l'élement de l'indice index
temp=("${array[@]}")
unset temp[$index]
#echo ${temp[@]}
#echo ${array[$index]} >> Output_$(($index+1)).txt
echo ${temp[@]} >> Output_$(($index+1)).txt
index=$(($index+1))
done
fi
#incrementation du compteur
i=$(($i+1))
#index=0
done < "$fichier"
IFS=$old_IFS
exit 0
#passer en mode root
#tapez dans la console shell la commande sudo su
#puis entrez votre mot de passe
#pour créer un script
#gedit nom_script.sh
#pour exécuter un script
#donnez les droits d'execution à votre script
#en tapant la commande chmod +x script.sh
#pour executer le script tapez bash script.sh chemin_database
我希望我能解释我想做什么,我将非常感谢任何可以帮助我的人
谢谢
最后一个问题,如果我有矩阵
8 5 6 4 1
7 8 2 7 2
4 3 2 5 2
我怎么能有最大值的总和,这意味着每行的最大值的总和,例如在最大第一行8,最大第二行8和最大最后一行5上方的示例中,我希望结果21为( 8 + 8 + 5),非常感谢
使用awk
awk 'NR==1{l=$1}
NR==2{t=$1;for (i=1;i<=t;i++) print l RS i> i ".txt"}
NR>2{ for (i=1;i<=t;i++)
{ for (j=1;j<=i;j++0)
printf $j FS > i ".txt"
printf $NF RS > i ".txt"
}
}' file
NR==1{l=$1}
得到第1行并保存到var lNR==2{t=$1;for (i=1;i<=t;i++) print l RS i> i ".txt"}
获得第2行,并将标题打印到每个文件1.txt,2.txt等NR>2
根据您的要求将结果打印到每个文件中。例如,如果需要在脚本中运行,请接受文件名作为选项。
#!/usr/bin/env bash
awk 'NR==1{l=$1}
NR==2{t=$1;for (i=1;i<=t;i++) print l RS i> i ".txt"}
NR>2{ for (i=1;i<=t;i++)
{ for (j=1;j<=i;j++0)
printf $j FS > i ".txt"
printf $NF RS > i ".txt"
}
}' $1
# Put your rest script here.
运行脚本:之后script.sh text.txt
,您将直接获得以下文件
$ cat 1.txt
3
1
8 1
7 2
4 2
$ cat 2.txt
3
2
8 5 1
7 6 2
4 8 2
$ cat 3.txt
3
3
8 5 6 1
7 6 1 2
4 8 2 2
$ cat 4.txt
3
4
8 5 6 4 1
7 6 1 5 2
4 8 2 7 2
源文件:
$ cat file
8 5 6 4 1
7 8 2 7 2
4 3 2 5 2
awk命令:
awk '{for (i=1;i<=NF;i++) max[NR]=max[NR]>$i?max[NR]:$i}END{for (i in max) sum+=max[i];print sum}' file
21
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句