我有两个文件,例如:
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(如果可能的话),我想对脚本做一个小解释,因为我是新手,我不太了解这些命令。
提前致谢。
答案 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命令。