0

次の形式のデータファイルがあります

ID       Date            Sex     Age     r_val  r_flag  l_val    l_flag
0106610856   16/09/11    M   50      12.061  N       11.447  N
0107470802   09/09/11    F   64      3.146   A       4.338   A
0108490513   21/07/11    M   61      8.243   A   7.344   A
0108590534   18/08/11    M   52      4.714   A   5.106   A
0109480651   26/07/12    M   63      9.403   N   9.136   N
0110460758   21/07/11    M   64      5.643   I   4.272   I
0111290260   08/11/12    F   83      9.747   N   8.551   A
0111410339   07/02/13    M   71      4.979   A   4.482   A

私がやりたいのは、新しいファイルID、Sex、Age、Value(対応するフラグがNに設定されている場合は常にr_valまたはl_val)に出力することです。上記の出力例を次に示します

0106610856        M      50      12.061 
0106610856        M      50      11.447         
0109480651        M      63      9.403   
0109480651        M      63      9.136   
0111290260        F      83      9.747  

これを実現するために、次のAwkコマンドを試しました。awk '{if ($6 ~ /N/) print $1,$3,$4,$5; else if ($6 ~ /N/) print $1,$3,$4,$7}'次の結果が得られます

0106610856 M 50 12.061
0109480651 M 63 9.403
0111290260 F 83 9.747

最初の条件が真の場合、ifループは$ 8〜/ N /の場合は検索されないため、これが正しくない形式であることを私は知っています。したがって、私のawkコマンドは、$6条件がfalseの場合にのみ$8条件がtrueの場合にl_valを取得します。r_flagとl_flagの両方がNに設定されている場合、awkコマンドを変更してr_valとl_valの両方を取得するにはどうすればよいですか。

4

1 に答える 1

1

使用しないでくださいif .. else$6==$8=="N"このように、あなたは単純に1つのケースを見逃します。

このワンライナーを試してみてください:

 awk 'NR>1{if($6=="N") print $1,$3,$4,$5; if($8=="N") print $1,$3,$4,$7 } ' file
于 2013-02-28T16:08:08.713 に答える