每次移除一组变量

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

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注