2017-10-09 78 views
1

首先文件,file_utm:BASH,合併兩個文件,下和上三角矩陣,成一個文件

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

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 
+0

謝謝。但是,當我用兩個大文件嘗試它時,它不起作用。 ASCII文件可以在以下網址找到:we.tl/TSBTSqacrj –

+0

@ Another.Chemist,我確實爲您當前的問題輸入而工作。我觀察過文件中的行 - 它們具有不一致/任意數量的列,並且看起來不屬於一個大矩陣的一部分 – RomanPerekhrest

+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>&- 
相關問題