我有一个问题,
事实上,我有一份存储数据的文本文件:第一行有一个数字表示观察次数,第二行是变量数量,从第三行开始,数据矩阵开始:每行代表一个个体,每列代表一个变量。
例如,我的数据库由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
命令的手册页同时阅读paste
和cut
的手册页。。。谷歌awk
和sed
命令以及
使用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
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