如果不同文件中相同位置的字段值为"零"则修改一个文件的字段值。

时间:2015-01-25 04:19:11

标签: linux shell unix

我有两个文件文件A和文件B.文件A包含一些值= 0。基于文件A的位置“零”值,文件B字段将变为空“”。输出和输入的示例如下所示。我粗略地了解如何做但不确定,有人可以提供帮助。谢谢。

File A

ABDC1

9.88E2 9.00E1 6.50E2 5.40E1 7.43E1

6.55E2 9.89E2 0.00E0 5.45E2 7.76E1

9.88E1 9.00E2 0.00E0 5.45E1 7.67E2

6.55E2 9.89E1 5.44E2 5.45E2 9.88E2

0.377E2

EFG3

9.88E2 9.00E2 0.00E0 5.54E1 7.67E2

7.55E2 9.98E2 5.44E2 4.54E2 0.00E0

5.88E2 9.60E1 0.00E0 5.40E1 4.67E2

4.55E2 0.00E0 5.45E2 4.00E0 9.88E2

6.43E2


File B


ABDC1

8.00E0 9.40E0 6.30E0 5.43E2 7.20E1

5.00E0 9.80E1 6.50E1 5.50E1 7.76E1

9.00E0 9.70E1 6.70E1 5.54E2 7.67E2

6.50E1 9.98E2 5.48E2 5.45E2 9.88E2

6.76E1

EFG3

4.88E2 9.30E1 6.80E1 5.30E1 7.60E1

6.55E2 9.80E1 5.40E1 4.50E1 7.70E1

1.88E2 6.00E0 1.00E1 5.00E0 4.60E1

5.50E1 5.40E1 5.40E1 4.50E1 9.80E1

6.65E2


Output expected:

FILE 3 (Output):


ABDC1

8.00E0 9.40E0 6.30E0 5.43E2 7.20E1

5.00E0 9.80E1 5.50E1 7.76E1

9.00E0 9.70E1 5.54E2 7.67E2

6.50E1 9.98E2 5.48E2 5.45E2 9.88E2

6.76E1

EFG3

4.88E2 9.30E1 5.30E1 7.60E1

6.55E2 9.80E1 5.40E1 4.50E1  

1.88E2 6.00E0 5.00E0 4.60E1

5.50E1 5.40E1 4.50E1 9.80E1

6.65E1

我正在尝试这样做:file4.txt和file3.txt与上面的文件A和B相同

 #!/bin/bash

    cp file4.txt temp.txt
    touch temp2.txt 

    i=1

    while IFS=' ' read -r f1 f2 f3 f4 f5


    do

      if [ $f$i = "0.00E0" ]

         then

              while IFS=' ' read -r r1 r2 r3 r4 r5

                 do

                    sed 's/$r$i/""/g' temp.txt >> temp2.txt


                  done <file4.txt

       fi

    let "i=i+1"

    done <file3.txt

1 个答案:

答案 0 :(得分:1)

你可以使用这个awk:

awk 'FNR==NR && NF==1{s=$1;next}
     FNR==NR{for(i=1; i<=NF; i++) if ($i=="0.00E0") a[s,FNR*100+i]++; next} 
     NF==1{s=$1;print s;next}
     NF==5{for(i=1; i<=NF; i++) if (a[s,FNR*100+i]==1) $i=""
} 1' fileA fileB | | column -t
ABDC1
8.00E0  9.40E0  6.30E0  5.43E2  7.20E1
5.00E0  9.80E1  5.50E1  7.76E1
9.00E0  9.70E1  5.54E2  7.67E2
6.50E1  9.98E2  5.48E2  5.45E2  9.88E2
EFG3
4.88E2  9.30E1  5.30E1  7.60E1
6.55E2  9.80E1  5.40E1  4.50E1
1.88E2  6.00E0  5.00E0  4.60E1
5.50E1  5.40E1  4.50E1  9.80E1