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

时间:2012-03-11 00:14:49

标签: bash

我有两个文件,例如:

File_1

c1,c2,c3,c4

File_2

c1,c3,c2,c4

DA,CA,DD,CD

因此,我想使用文件1作为模型使用BASH创建文件3:

File_3

c1,c2,c3,c4

DA,DD,CA,CD

在此示例中,File_1是列的正确处置模型,File_2具有列及其各自的信息但处置错误。因此,File_3使用file_1作为模板,并以正确的方式对file_2中的信息进行排序。

在示例中,我只提供了4列,但我的真实文件有402列。 所以,做一个

awk -F"," '{print $1","$3","$2","$4}' File_2

或类似的东西,将无法工作,因为我不知道File_2中的File_1的位置(例如,File_2中的c1列可能位于第六列,第二列或最后一列中)

我希望你可以帮我使用BASH(如果可能的话),我想对脚本做一个小解释,因为我是新手,我不太了解这些命令。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以像这样制作标题索引映射:

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

awk -F, '
    FNR==NR{
        for(i=1;i<=NF;i++)
            a[$i]=i
        print
        nextfile
    }
    FNR==1{
        for(j=1;j<=NF;j++)
            b[j]=a[$j]
        next
    }
    {
        for(k=1;k<=NF;k++)
            printf( "%s%s",$b[k], k==NF?"\n":",")
    }
' File_{1,2}

注意:如果File_{1,2}不包含空行,则此命令有效!

答案 1 :(得分:0)

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

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

为:

s/c1/DA/g
s/c3/CA/g
s/c2/DD/g
s/c4/CD/g

你可以使用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-Program是上面的那个。如果替换匹配以下命令的键,则可能会出现意外结果。如果您只想匹配整个单词,则必须稍微更改sed命令。