BASH,将两个文件,下三角矩阵和上三角矩阵合并为一个文件

时间:2017-10-09 08:37:30

标签: bash matrix awk sed grep

第一个文件,file_utm:

1.3 3.5 2.8
    2.1 1.4
        0.5

第二个文件,file_ltm:

1.3
3.5 2.1
2.8 1.4 0.5

一个条件,if i=j; then i=j=0; fi

输出文件:

0 1.3 3.5 2.8
1.3 0 2.1 1.4
3.5 2.1 0 0.5
2.8 1.4 0.5 0

这就是我的尝试:

#!/bin/bash
for (( x=1; x<=3; x++ ))
do
    awk -v var=$x 'NR==var' file_utm > ROW
    awk -v var=$x 'NR==var' file_ltm > COLUMN
    for (( y=1; y<=3; y++ ))
    do
        R=`awk -F  "\t" -v var=$y '{print $var}' ROW`
        C=`awk -F  "\t" -v var=$y '{print $var}' COLUMN`
        echo $R >> file
        echo $C >> file
        rm ROW
        rm COLUMN
    done
done

我拥有的另一个选项是用一个只有空格的矩阵填充一个文件,用制表符分隔,然后通过给定一个值填充这个矩阵并寻址行和列位置。我知道如何用C ++做,但不是用bash和awk。

2 个答案:

答案 0 :(得分:2)

Awk 解决方案:

awk 'NR==FNR{ a[NR+1]=$0 FS 0; next }{ sub(/^ +/,""); print (FNR==1)? 0:a[FNR],$0 }
     END{ print a[FNR+1] }' file_ltm file_utm

输出:

0 1.3 3.5 2.8
1.3 0 2.1 1.4
3.5 2.1 0 0.5
2.8 1.4 0.5 0

答案 1 :(得分:1)

使用文件描述符5和6

读取这两个文件
# opening files descriptor for reading
exec 5< file_utm || exit 1
exec 6< file_ltm || exit 1

read -u5 up
echo "0 $up"
while read -u5 up; read -u6 low; [[ $low ]]; do
    echo "$low 0 $up"
done

# closing files
exec 5>&-
exec 6>&-