在BASH中使用另一个作为模板创建新文件
我有两个文件,例如: 文件1在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",
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
。我想你可以在几分钟内理解它们。