我有一个问题,
实际上我有一个文本文件来存储数据:第一行是一个数字,表示观察的数量,第二行是变量的数量,从第三行开始是数据矩阵:每行代表一个个体,每列代表一个变量。
例如,我的数据库由3个观察和4个变量组成,如下所示:
348 5 6 4 17 6 1 5 24 8 2 7 2
最后一列代表每个观察的类别
我正在寻找一个程序,它可以给我3个(变量数量 – 1)数据库,第一个数据库由第一个变量和类别组成,第二个数据库由前两个变量和类别组成,第三个数据库由前三个变量和最后一列的类别组成,因此我的新数据库必须是文本格式,如下所示(第一行:观察数量,第二行:变量数量),第一个文本文件将是:
318 17 24 2
第二个文本文件将是:
328 5 17 6 24 8 2
第三个文本文件将是:
338 5 6 17 6 1 24 8 2 2
我有一个每次移除一个变量的程序,我想修改它以实现上述功能
程序是:
#!/bin/sh#script.sh#initialisation du compteuri=0index=0nb0=0nbV=0tab[1]=0#fichier="test.txt"fichier=$1old_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 2if [ "$i" -eq 0 ]; thenecho "nbO : $ligne"nbO=$ligneelif [ "$i" -eq 1 ]; thenecho "nbV: $ligne"nbV=$lignewhile [ "$index" -lt "$nbV" ]doecho $nbO >> Output_$(($index+1)).txtindex=$(($index+1))doneindex=0while [ "$index" -lt "$nbV" ]doecho $(($nbV-1)) >> Output_$(($index+1)).txtindex=$(($index+1))doneelseindex=0IFS=' 'read -a array <<<"$ligne"#récuperer le nombre de variables à partir #de la taille du tableau contenant les variablesnbV=${#array[*]}while [ "$index" -lt "$nbV" ]do #supprimer l'élement de l'indice indextemp=("${array[@]}")unset temp[$index]#echo ${temp[@]} #echo ${array[$index]} >> Output_$(($index+1)).txtecho ${temp[@]} >> Output_$(($index+1)).txtindex=$(($index+1))donefi#incrementation du compteuri=$(($i+1))#index=0done < "$fichier"IFS=$old_IFSexit 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 17 8 2 7 24 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}
获取第一行并保存到变量l中NR==2{t=$1;for (i=1;i<=t;i++) print l RS i> i ".txt"}
获取第二行,并将标题打印到每个文件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# 在这里放置您的其余脚本内容。
运行脚本后: script.sh text.txt
,您将直接获得以下文件
结果
$ cat 1.txt318 17 24 2$ cat 2.txt328 5 17 6 24 8 2$ cat 3.txt338 5 6 17 6 1 24 8 2 2$ cat 4.txt348 5 6 4 17 6 1 5 24 8 2 7 2
编辑:对于第二个请求,获取最大值和总和,以下是代码:
源文件:
$ cat file8 5 6 4 17 8 2 7 24 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}' file21