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
答案 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
简要说明,
NR==FNR{a[$1]=$2;next
:将2.txt的$1
记录到数组a中$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
。