每次删除一组变量



我有一个问题,
事实上,我有一份存储数据的文本文件:第一行有一个数字表示观察次数,第二行是变量数量,从第三行开始,数据矩阵开始:每行代表一个个体,每列代表一个变量。

例如,我的数据库由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

我有一个程序,每次都会删除一个变量,我想对它进行midify,这样它就会给我上面解释的

程序是:

#!/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),非常感谢

好的,只有一个建议:不应该这么难。。。阅读join命令的手册页同时阅读pastecut的手册页。。。谷歌awksed命令以及

使用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 l
  • NR==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

edit:对于第二个获取max和sum的请求,这里是代码:

源文件:

$ 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

相关内容

  • 没有找到相关文章