4

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          

2行ごとに合計してN行ファイルを出力したい。「?」がある場合 行の場合、出力は「?」になるはずです。その特定のフィールドに対して (?+0=?+1=?+? = ?)。したがって、私の例の出力は次のようになります。

2 ? 1 ? 2 ?
1 ? 1 ? 1 ?
0 0 1 ? 0 ?
1 ? 1 1 2 2

このコードを試してみましたが、計算中に欠落データを「0」として扱っているようです。欠落しているデータを「?」として保持する方法はありますか? ?

cat <input_file> |awk -F ' ' '{if (NR%2==1){for(j=1;j<=NF;j++)array[j]=$j;}else{result="";for(i=1;i<=NF;i++){tmp=array[i]+$i;result=sprintf("%s%d ",result,tmp);}print result;}}' > <output_file>

助けてください。どんな提案でも大歓迎です!

4

3 に答える 3

3

各フィールドを以下と比較する必要があると思います"?":

< input_file  awk '
NR%2 { split($0,saved,FS) }      # save odd line fields
NR%2 == 0 {                      # on even lines:
  for(i=1; i<=NF; i++){
    $i = $i=="?"       ? "?" :   #  "?" if this line field is "?"
         saved[i]=="?" ? "?" :   #  "?" if the previous line field was "?"
         saved[i]+$i             #  the sum otherwise
  }
  print
}'
于 2012-09-20T22:48:43.523 に答える
3

(bash)シェルだけで実行できます:

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で、私は似たようなことを書きます

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
于 2012-09-21T01:00:57.907 に答える
1
> 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 スクリプトを作成したら、次のコマンドを使用します。

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
于 2012-09-25T07:04:02.743 に答える