如果不同文件中相同位置的字段值为"zero",则修改一个文件的字段值
modify field values of one file if the value of the field at the same position in a different file is "zero"
我有两个文件文件 A 和文件 B。文件 A 包含一些值 = 0 。基于文件 A "zero" 值的位置,文件 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
你可以使用这个 awk:
awk 'FNR==NR && NF==1{s=;next}
FNR==NR{for(i=1; i<=NF; i++) if ($i=="0.00E0") a[s,FNR*100+i]++; next}
NF==1{s=;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
我有两个文件文件 A 和文件 B。文件 A 包含一些值 = 0 。基于文件 A "zero" 值的位置,文件 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
你可以使用这个 awk:
awk 'FNR==NR && NF==1{s=;next}
FNR==NR{for(i=1; i<=NF; i++) if ($i=="0.00E0") a[s,FNR*100+i]++; next}
NF==1{s=;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