Awk 如何将每两行相加为一行,同时显示缺失的数据并保持不变?
我有一个有2N行的多列文件,它由0、1和丢失的数据(编码为“?”)组成。看起来是这样的: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
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