Arrays 从两个文件中读取变量,并在第三个文件中以模式输出

Arrays 从两个文件中读取变量,并在第三个文件中以模式输出,arrays,bash,shell,while-loop,exec,Arrays,Bash,Shell,While Loop,Exec,我有以下两个文件: a1,b1,c1,d1,x1,e1,f1,y1,g1,z1,h1 a2,b2,c2,d2,x2,e2,f2,y2,g2,z2,h2 a3,b3,c3,d3,x3,e3,f3,y3,g3,z3,h3 a4,b4,c4,d4,x4,e4,f4,y4,g4,z4,h4 文件1: a1,b1,c1,d1,e1,f1,g1,h1 a2,b2,c2,d2,e2,f2,g2,h2 a3,b3,c3,d3,e3,f3,g3,h3 a4,b4,c4,d4,e4,f4,g4,h4 文件2:

我有以下两个文件:

a1,b1,c1,d1,x1,e1,f1,y1,g1,z1,h1
a2,b2,c2,d2,x2,e2,f2,y2,g2,z2,h2
a3,b3,c3,d3,x3,e3,f3,y3,g3,z3,h3
a4,b4,c4,d4,x4,e4,f4,y4,g4,z4,h4
文件1:

a1,b1,c1,d1,e1,f1,g1,h1
a2,b2,c2,d2,e2,f2,g2,h2
a3,b3,c3,d3,e3,f3,g3,h3
a4,b4,c4,d4,e4,f4,g4,h4
文件2:

x1,y1,z1
x2,y2,z2
x3,y3,z3
x4,y4,z4
我想同时从这两个数据中读取并以如下模式输出变量:

a1,b1,c1,d1,x1,e1,f1,y1,g1,z1,h1
a2,b2,c2,d2,x2,e2,f2,y2,g2,z2,h2
a3,b3,c3,d3,x3,e3,f3,y3,g3,z3,h3
a4,b4,c4,d4,x4,e4,f4,y4,g4,z4,h4
好消息-我已经成功实现了

坏消息-数组和while循环太多(计算太多!)。我正在寻找一些更简单的东西,因为脚本需要读取大量数据(4k行和1M字)

限制-bashshell(可能不是限制!)

这就是我所做的

exec 5<file1 # Open file into FD 5
exec 6<file2 # Open file into FD 6

while IFS=$"," read -r line1 <&5
IFS=$"," read -r line2 <&6
do
    array1=( `echo $line1` )
    array2=( `echo $line2` )
    array3=("${array1[@]}","${array2[@]}")
    echo ${array3[@]} >> tmpline
done
while IFS="," read var1 var2 var3 var4 var5 var6 var7 var8 var9 var10 var11
do
    echo -e "$var1,$var2,$var3,$var4,$var9,$var5,$var6,$var10,$var8,$var11,$var9" >> tcomb
done < tmpline

exec 5<&- # Close FD 5
exec 6<&- # Close FD 6
exec 5 tcomb
完成exec 5您可以使用
粘贴
组合文件行。然后,您必须对列进行重新排序,我使用了Perl:

paste file1 file2 -d, | \
    perl -F, -ane 'chomp $F[-1]; $"=","; print "@F[0..3,8,4,5,9,6,10,7]\n"'
试试这个:

exec 5<file1 # Open file into FD 5
exec 6<file2 # Open file into FD 6

while IFS=, read -a t <&5 &&
      IFS=, read -a u <&6
do
    echo -n "${t[0]},${t[1]},${t[2]},${t[3]},${u[0]},${t[4]},"
    echo    "${t[5]},${u[1]},${t[6]},${u[2]},${t[7]}"
done >| tcomb

exec 5<&- # Close FD 5
exec 6<&- # Close FD 6

exec 5如果允许自己多次读取文件,并使用bash进程替换:

paste -d , <(cut -d , -f 1-4 file1) \
           <(cut -d , -f 1 file2) \
           <(cut -d , -f 5-6 file1) \
           <(cut -d , -f 2 file2) \
           <(cut -d , -f 7 file1) \
           <(cut -d , -f 3 file2) \
           <(cut -d , -f 8 file1)

paste-d,我现在知道如何在这个论坛中编辑了。。在过去的几天里一直在努力做到这一点。。。。有人在找“怎么做”的课程吗!修改了我的代码一点。。。。但是在读r行的时候仍然有太多的计算,我现在用这个来做这件事。。看起来更简单,谢谢大家!-->粘贴-d,file1file2 | awk-F,'{OFS=“,”}{print$1、$2、$3、$4、$9、$5、$6、$7、$10、$7、$11、$8}'。。但我还是会试试这个。。。thnx使用awk而不是
perl
,然后使用awk(这在alla UNIXes中是标准的):
awk-F,-v of s=“,”{print$1、$2、$9、$3、$4、$10、$5、$6、$11、$7、$8}
@jfgagne,我喜欢你的“awk”东西。。。你能告诉我哪一个会使用更少的计算周期,我在评论中提到的“awk”或“array”吗?。。。这对我正在编写的脚本来说很重要@Marcos:我的猜测是
paste
+
awk
将比单个(但复杂且未优化)bash更快,但只有一种方法知道它,那就是测试它;-)。此外,不要使用临时文件:而不是
粘贴…>tmp_文件;啊。。。tmp_文件>最终_文件
do
paste…|啊…>文件
@jfgagne,“awk”命令似乎遗漏了什么。我添加了paste+awk,比如-->paste-d,file1 file2 | awk'{FS=“,”{print$1、$2、$3、$4、$9、$5、$6、$7、$10、$7、$11、$8}’;tr-s”“,”--您会注意到我添加了一个“tr-s”,因为“awk”并不是以CSV的形式发送输出,而是以“空格分隔”的形式发送,我的要求是以CSV的形式输出,而是添加“tr-s”没有多大帮助,就像我的任何值都是一个空格(),它在那里添加了逗号..:(!有什么想法吗?谢谢Edouard….我想这里的计算周期减少了..这能进一步减少吗?还有“|”最后做了什么?
强制覆盖,而不需要
设置-o noclober
。我喜欢你的
执行器
!没有其他减少计算时间的想法…我修改了你的“echo”第一部分——echo-e“${t[0]},${t[1]},${t[2]},${t[3]},${u[0]},${t[4]},${t[5]},${t[1]},${t[6]},${u[2]},${t[7]}”--希望您喜欢!再次修改我的脚本,粘贴-d,file1 file1 file2>file2>file3而IFS=,读取var1 var2 var3 var4 var6 var6 var8 var9 vare-vare“$var1、$var2、$var3、$var4、$var9、$var5、$var6、$var10、$var8、$var11、$var9">>tcomb unset-IFS doneIFS=,
值随着
而消失,因此
unset-IFS
删除旧的
IFS
您想重新获得的!恐怕我不能使用此方法。.我要处理的数据有很多文件,每个文件包含大约4k行和~1MW我知道我不应该用bash!但是!