Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在每次运行后修改bash脚本?_Bash_Awk - Fatal编程技术网

如何在每次运行后修改bash脚本?

如何在每次运行后修改bash脚本?,bash,awk,Bash,Awk,下面的Script1.sh在每个文件中使用第1列(键)和第2列(值),并根据其他_scripts.sh中的一些代码打印一些输出。script2.sh只是同时运行script1.sh和其他脚本 现在,是否可以将类似的过程扩展到第1列和第3列(output.n2)并重复该过程(output.nn) 注意:我有大约20k列。每个文件都有相同的精确列数 $cat文件1 s n1 n2 n3 s1 2 3 4 s2 3 4 5 s3 0 1 4 s4 9 8

下面的Script1.sh在每个文件中使用第1列(键)和第2列(值),并根据其他_scripts.sh中的一些代码打印一些输出。script2.sh只是同时运行script1.sh和其他脚本

现在,是否可以将类似的过程扩展到第1列和第3列(output.n2)并重复该过程(output.nn)

注意:我有大约20k列。每个文件都有相同的精确列数

$cat文件1

s   n1  n2  n3
s1  2   3   4
s2  3   4   5
s3  0   1   4
s4  9   8   7
$cat文件2

s   n1  n2  n3
s1  12  13  14
s2  13  14  15
s3  10  11  14
s4  19  18  17
$cat文件3

s   n1  n2  n3
s1  12  33  44
s2  13  43  54
s3  10  13  44
s4  19  83  74
$cat文件

s   n1  n2  n3
s1  25  33  40
s2  35  43  50
s3  50  13  40
s4  95  83  70
脚本1.sh

awk '{print $1"\t"$2}' file1 | awk '{print $1"\t""file1""\t"$2}' >> r.1
awk '{print $1"\t"$2}' file2 | awk '{print $1"\t""file2""\t"$2}' >> r.1
awk '{print $1"\t"$2}' file3 | awk '{print $1"\t""file3""\t"$2}' >> r.1
awk '{print $1"\t"$2}' filen | awk '{print $1"\t""filen""\t"$2}' >> r.1
其他_scripts.sh

grep file r.1 |awk '{print $1"\t"$2"\t"$3*100}' > output.n1
rm r.1
脚本2.sh

sh script1.sh
sh other_scripts.sh
产出1.n1

s1  file1   200
s2  file1   300
s3  file1   0
s4  file1   900
s1  file2   1200
s2  file2   1300
s3  file2   1000
s4  file2   1900
s1  file3   1200
s2  file3   1300
s3  file3   1000
s4  file3   1900
s1  filen   2500
s2  filen   3500
s3  filen   5000
s4  filen   9500

试试这个脚本。这将使用您提供的输入精确地再现您所需的输出

#!/bin/bash

NUMBER_OF_COLUMNS=3
NUMBER_OF_FILES=4    # Assuming the files are like file{n}


for coln in `seq 1 $NUMBER_OF_COLUMNS`; do
  for filen in `seq 1 $NUMBER_OF_FILES`; do
    awk -v n=$coln -v filen=$filen 'NR>1{printf"%s\tfile%i\t%s\n", $1, filen, $(1+n)*100}' file$filen >> output.$coln
  done
done

将其复制到文件中,使其可执行(
chmod+x
),并在包含所有文件的目录中运行脚本(
/
)。请记住将正确的数字作为
NUMBER\u OF_COLUMNS
NUMBER\u OF_FILES

哦,非常感谢。但是每次添加一个数字时,我都需要运行script2.sh。我认为我的帖子让很多用户感到困惑,而且没有输入的例子(对不起)。这就是为什么他们投了反对票:(现在我编辑了这个问题。希望它现在清楚了?不,不清楚。我得到了以下输出,例如output.n1
s file0 0
让我们看看。要弄清楚您对数据实际做了什么有点困难。您能为您的问题添加一些示例输入和预期输出,以便我们可以测试答案吗?这是almo确保有更好的方法来实现你正在做的事情,不管是什么,解决根本问题比仅仅帮助你实现一个不太理想的解决方案要好将变量写入单独的数据文件,在脚本中读取并更新。将代码和数据分开--违反该规则会导致数据丢失、SCM内容混乱、安全漏洞(不以代码形式运行数据是避免注入攻击的最重要步骤)此外,在构建代码示例时,请尝试遵循以下指导原则:代码示例应该是最小的、完整的和可验证的。“最小”意味着它应该尽可能小,同时仍然演示问题;“完整的”和“可验证的”这意味着其他人应该能够复制/粘贴/运行您的代码示例,并看到您询问的相同错误;事实上,这是伪代码,无法运行。感谢您的宝贵意见。现在我编辑了这个问题。希望现在已经清楚了?
其他脚本。sh
将仅在输出中复制
文件1
。您如何定义在script1.sh中,像
“AA”
这样的字符串是否与文件的编号有关?