2

私は以下のような2つのファイルを持っています:

file1:

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

file2:

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ワード)を読み取る必要があるため、もっと簡単なものを探しています。

制限-BASHシェル(おそらく制限ではありません!)

これは私がやったことです

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

よろしくお願いします-私は辛抱強く待っています:)!!

4

3 に答える 3

5

これを試して:

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
于 2013-03-17T13:26:46.797 に答える
1

pasteファイルの行を結合するために使用できます。次に、列を並べ替える必要があります。そのためにPerlを使用しました。

paste file1 file2 -d, | \
    perl -F, -ane 'chomp $F[-1]; $"=","; print "@F[0..3,8,4,5,9,6,10,7]\n"'
于 2013-03-17T13:19:47.073 に答える
0

ファイルを複数回読み取ることを許可し、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)
于 2013-03-17T15:51:30.680 に答える