Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 如何将每两行相加为一行,同时显示缺失的数据并保持不变?_Awk - Fatal编程技术网

Awk 如何将每两行相加为一行,同时显示缺失的数据并保持不变?

Awk 如何将每两行相加为一行,同时显示缺失的数据并保持不变?,awk,Awk,我有一个有2N行的多列文件,它由0、1和丢失的数据(编码为“?”)组成。看起来是这样的: 1 0 0 ? 1 ? 1 ? 1 ? 1 1 1 0 1 ? 1 1 0 ? 0 1 0 ? 0 0 1 ? 0 0 0 0 0 ? 0 ? 0 ? 0 0 1 1 1 1 1 1 1 1 我想每两行求和并输出一个N行文件。如果行中有一个“?”,则该特定字段的输出应为“?”(+0=?+1=?+?=?)。因此,我的示例的输出如下所示: 2 ? 1 ? 2 ? 1 ? 1 ? 1 ? 0

我有一个有2N行的多列文件,它由0、1和丢失的数据(编码为“?”)组成。看起来是这样的:

1 0 0 ? 1 ?
1 ? 1 ? 1 1
1 0 1 ? 1 1
0 ? 0 1 0 ?
0 0 1 ? 0 0
0 0 0 ? 0 ?
0 ? 0 0 1 1
1 1 1 1 1 1          
我想每两行求和并输出一个N行文件。如果行中有一个“?”,则该特定字段的输出应为“?”(+0=?+1=?+?=?)。因此,我的示例的输出如下所示:

2 ? 1 ? 2 ?
1 ? 1 ? 1 ?
0 0 1 ? 0 ?
1 ? 1 1 2 2
我尝试了这段代码,但它似乎在计算时将丢失的数据视为“0”。是否有办法将丢失的数据保留为“?”


cat | awk-F'{if(NR%2==1){for(j=1;j恐怕您必须将每个字段与
“?”进行比较。


读取行时;执行以下操作
设置--$line
读线
ari=($line)
i=0
为arg;do
如果[“$arg”=”?“-o”${ari[i]}”=”?“],则
printf“?”
其他的
printf“%d”$($arg+${ary[i]}))
fi
((i++)
完成
printf“\n”
完成<文件
有了awk,我会写类似的东西

awk '{ 
    getline nextline
    split(nextline, ary)
    for (i=1; i<=NF; i++) {
        if ($i == "?" || ary[i] == "?")
            printf("? ")
        else
            printf("%d ", $i + ary[i])
    }
    print ""
}' file
awk'{
getline下一行
拆分(下一行,ary)
对于(i=1;i
测试如下:

> awk -f temp.awk temp
 2 ? 1 ? 2 ?
 1 ? 1 ? 1 ?
 0 0 1 ? 0 ?
 1 ? 1 1 2 2

OneLiner很酷,但对于复杂的任务,空格和换行符确实很有帮助。特别是在试图了解到底发生了什么的时候。您可以使用awk的
-f
选项来指定脚本中的文件。您可能能够找到正确的位置,立即插入
if
-语句,在您决定的位置只需
printf
a
,或者如果需要添加两个数组项。+1,但
NR%2==0
可以编写
!NR%2
(虽然这里的简洁性可能更差)和uuooc!!(从来不是一件好事)。@willampersell:我知道有人会抱怨uooc;-P
while read line; do 
    set -- $line
    read line
    ary=( $line )
    i=0
    for arg; do     
        if [ "$arg" = "?" -o "${ary[i]}" = "?" ]; then          
            printf "? "     
        else
            printf "%d " $(( $arg + ${ary[i]} ))     
        fi     
        ((i++)) 
    done 
    printf "\n"
done < file
awk '{ 
    getline nextline
    split(nextline, ary)
    for (i=1; i<=NF; i++) {
        if ($i == "?" || ary[i] == "?")
            printf("? ")
        else
            printf("%d ", $i + ary[i])
    }
    print ""
}' file
> cat temp.awk
{
if(NR%2==1)
 {
  split($0,a," ");
 }
 else
 {
 line="";
 for(i=1;i<=NF;i++)
 {
  a[i]=="?"||$i=="?" ? sum="?":sum=a[i]+$i;
  line=line" "sum;
 }
 print line; 
 }
}
awk -f temp.awk your_file
> awk -f temp.awk temp
 2 ? 1 ? 2 ?
 1 ? 1 ? 1 ?
 0 0 1 ? 0 ?
 1 ? 1 1 2 2