在BASH中使用另一个作为模板创建新文件

在BASH中使用另一个作为模板创建新文件,bash,Bash,我有两个文件,例如: 文件1 c1,c2,c3,c4 文件2 c1,c3,c2,c4 DA,CA,DD,CD 因此,我想使用BASH将文件1作为模型创建一个文件3: 文件3 c1,c2,c3,c4 DA,DD,CA,CD 在本例中,文件_1是列正确配置的模型,文件_2具有列及其各自的信息,但配置错误。因此,文件_3使用文件_1作为模板,并以正确的方式排列文件_2中的信息 在这个例子中,我只给出了4列,但我的真实文件有402列。 那么,做一个 awk -F"," '{print $1",

我有两个文件,例如:

文件1

c1,c2,c3,c4
文件2

c1,c3,c2,c4

DA,CA,DD,CD
因此,我想使用BASH将文件1作为模型创建一个文件3:

文件3

c1,c2,c3,c4

DA,DD,CA,CD
在本例中,文件_1是列正确配置的模型,文件_2具有列及其各自的信息,但配置错误。因此,文件_3使用文件_1作为模板,并以正确的方式排列文件_2中的信息

在这个例子中,我只给出了4列,但我的真实文件有402列。 那么,做一个

awk -F"," '{print $1","$3","$2","$4}' File_2
或者类似的东西,将不起作用,因为我不知道文件1在文件2中的位置(例如,文件2中的c1列可能在第六列、第二列或最后一列的位置)

我希望您能帮助我使用BASH(如果可能的话),我想对脚本做一个小的解释,因为我是新手,对命令了解不多


提前感谢。

如果您可以自由更改文件2的格式,请从:

File_2
c1,c3,c2,c4    
DA,CA,DD,CD
致:

您可以使用sed:

sed -f File_2 File_1 > File_3
否则,您可以使用阵列:

key=($(head -n1 File_2 | tr "," " "))
val=($(tail -n1 File_2 | tr "," " "))
len=${#key[*]}
for i in $(seq 0 $((len-1))); do echo s/${key[$i]}/${val[$i]}/g; done > subst.sed 
sed -f subst.sed File_1 > File_3 

生成的sed程序如上所述。如果替换与以下命令的键匹配,则可能会得到意外的结果。如果您只想匹配整个单词,则必须稍微更改sed命令。

如果您可以随意更改文件2的格式,请从:

File_2
c1,c3,c2,c4    
DA,CA,DD,CD
致:

您可以使用sed:

sed -f File_2 File_1 > File_3
否则,您可以使用阵列:

key=($(head -n1 File_2 | tr "," " "))
val=($(tail -n1 File_2 | tr "," " "))
len=${#key[*]}
for i in $(seq 0 $((len-1))); do echo s/${key[$i]}/${val[$i]}/g; done > subst.sed 
sed -f subst.sed File_1 > File_3 

生成的sed程序如上所述。如果替换与以下命令的键匹配,则可能会得到意外的结果。如果您只想匹配整个单词,则必须稍微更改sed命令。

您可以创建如下标题索引映射:

File_2  =>  File_1
------      ------
1       =>  1
2       =>  3
3       =>  2
4       =>  4

awk-F,'
FNR==NR{

对于(i=1;i,您可以制作如下的标题索引映射:

File_2  =>  File_1
------      ------
1       =>  1
2       =>  3
3       =>  2
4       =>  4

awk-F,'
FNR==NR{

对于(i=1;iThanks-Kev。它工作得非常好。我有100000多行代码,可以随心所欲地快速工作。你鼓励我读哪个网站来理解脚本?只需要基本的
awk
材料:
for…loop
printf
next/nextfile
NR/FNR
。我想你几分钟就能理解它们。Thanks Kev。它工作得很好。我有100000多行代码,可以随心所欲地快速工作。你鼓励我读哪个网站来理解脚本?只需基本的
awk
内容:
for…loop
printf
下一个/nextfile
NR/FNR
。我想你可以在几分钟内理解它们。