マイナス記号を保持したまま特定の列の数値を削除しますか?

マイナス記号を保持したまま特定の列の数値を削除しますか?

奇数列にのみ負数を使用して、水平方向と垂直方向に無限に続く次のデータフレームがあります。

-1  2  3  4 -5  9
 2  3 -4  5 -6  11

私は2番目、4番目、6番目の全列(またはすべての偶数列)が必要で、マイナス記号は最初、3番目、5番目(またはすべての奇数列)でのみ必要なので、次のような結果が得られます。

- 2   4 - 9
  3 - 5 - 11

ついに次のような結果が出ました。

-2  4 -9
 3 -5 -11

したがって、同じままにするには偶数列の値が必要であり、奇数列の値は負の値が存在する場合はそのまま維持され、正の値がある場合は破棄されます。

awk / sedを使用してこれを行う方法はありますか?

私の知る限り、おおよそです。

awk '{ for (i=2;i<=NF;i+=2) $i="" }1' FILE.txt | sed 's/[0-9,.]*//g' 

ベストアンサー1

方法sed:

sed -E '
    s/^(([ \t]*-?[ \t]*[0-9.]+[ \t]+[0-9.]+)*)[ \t]+-?[ \t]*[0-9.]+$/\1/;
    s/[0-9.]+[ \t]+([0-9.]+)/\1/g'

出力:

-2  4 -9
 3 -5 -11

列数が奇数の場合、最初の式は末尾の列を削除します。<number> <number>最初の数字が負の数である可能性があるゼロ以上のペアを見つけてこれを実行します。

編集する:sed@mikeservに触発されたより短い解決策:

sed -E '
    s/[0-9.]+[ \t]*([0-9.]*)/\1/g;
    s/[- \t]*$//'

同じことperl:

perl -lpe 's/^((\s*-?\s*[\d.]+\s*[\d.]+)*)\s+-?\s*[\d.]+$/$1/o; s/[\d.]+\s+([\d.]+)/$1/g'

他の方法perl(おそらく最もきれいな方法):

perl -lpe '$a = 1; s/([\d.]+\s*)/$a++ % 2 ? "" : $1/eg; s/[-\s]*$//o'

おすすめ記事