如果匹配,如何比较两个文本文件与第一列,如果不比较则打印相同,然后置零?

时间:2018-07-17 04:34:56

标签: linux shell join awk sed

1.txt包含

1  
2  
3  
4  
5  
.  
.  
180    

2.txt包含

3  0.5  
4  0.8  
9  9.0  
120  3.0  
179  2.0  

所以我希望我的输出像2.txt与1.txt的第一列匹配,然后应该输出2.txt中第二列的值。而如果不匹配,则应打印零。

类似

的输出应为:

1  0.0  
2  0.0  
3  0.5  
4  0.8  
5  0.0  
.  
.  
8 0.0  
9 9.0
10 0.0  
11 0.0  
.  
.  
.  
120 3.0  
121 0.0  
.  
.  
150 0.0  
.  
179 2.0  
180 0.0  

3 个答案:

答案 0 :(得分:0)

awk 'NR==FNR{a[$1]=$2;next}{if($1 in a){print $1,a[$1]}else{print $1,"0.0"}}' 2.txt 1.txt

简要说明,

  1. NR==FNR{a[$1]=$2;next:将2.txt的$1记录到数组a中
  2. 如果数组a中存在1.txt中的$1,则打印a[$1],否则打印0.0

答案 1 :(得分:0)

能否请您尝试以下操作,如果有帮助,请告诉我。

awk 'FNR==NR{a[$1];next} {for(i=prev+1;i<=($1-1);i++){print i,"0.0"}}{prev=$1;$1=$1;print}'  OFS="\t" 1.txt 2.txt

代码说明:

awk '
FNR==NR{                       ##Checking condition FNR==NR which will be TRUE when 1.txt is being read.
  a[$1];                       ##Creating an array a whose index is $1.
  next                         ##next will skip all further statements from here.
}
{
  for(i=prev+1;i<=($1-1);i++){ ##Starting a for loop from variable prev+1 to till value of first field with less than 1 to it.
    print i,"0.0"}             ##Printing value of variable i and 0.0 here.
}
{
  prev=$1;                     ##Setting $1 value to variable prev here.
  $1=$1;                       ##Resetting $1 here to make TAB output delimited in output.
  print                        ##Printing the current line here.
}'  OFS="\t" 1.txt 2.txt       ##Setting OFS as TAB and mentioning Input_file(s) name here.

执行上述代码:

输入文件:

cat 1.txt
1
2
3
4
5
6
7
cat 2.txt
3  0.5
4  0.8
9  9.0

输出将如下所示:

awk 'FNR==NR{a[$1];next} {for(i=prev+1;i<=($1-1);i++){print i,"0.0"}}{prev=$1;$1=$1;print}'  OFS="\t" 1.txt 2.txt
1       0.0
2       0.0
3       0.5
4       0.8
5       0.0
6       0.0
7       0.0
8       0.0
9       9.0

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -r 's#^(\S+)\s.*#/^\1\\s*$/c&#' file2 | sed -i -f - -e 's/$/ 0.0/' file1

从file2创建sed脚本,如果file2的第一个字段与file1的第一个字段匹配,则将匹配行更改为file2中匹配行的内容。然后将所有其他行归零,即未更改的行会附加0.0