2つの列の値を結合する方法は?

2つの列の値を結合する方法は?

次の形式のファイルがあります。

$ cat /tmp/raw
2015-01   5000   1000
2015-02   6000   2000
2015-03   7000   3000

今私が望むのは、各行の列2と列3で結合された値を取得することです。結果は次のとおりです。

2015-01   6000
2015-02   8000
2015-03   9000

これを試しましたが、ファイルの最後の値のみが表示されます(例:2015-03値)。

答え1

いくつかの方法があります:

  1. 別のawkメソッド

    awk '{$2+=$3;}NF--' file
    
  2. パール

    perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
    

    または

    perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
    
  3. シェル(上記よりはるかに遅いまたは効率が悪い)

    while read a b c; do echo "$a $((b + c))"; done < file
    

答え2

以下を試すことができますawk

awk '{ print $1, $2 + $3; }' /tmp/raw

結果は次のとおりです(2015-03の値は10000でなければならないと思います)。

2015-01 6000
2015-02 8000
2015-03 10000

答え3

sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc

...印刷...

2015-01   6000
2015-02   8000
2015-03   10000

だから上で私は次のことを宣言しました。正規表現それフィールド範囲によって*可変長単一文字シーケンスは次のとおりです。^<space>ではない続いて*可変長単一文字シーケンスは次のとおりです。<スペース>。この宣言が適用されるパターンスペースsedは区切り文字列です。(基本的に)入力に現れるすべての行文字を\n再帰的に置き換えます。(基本的に)以下は、同じ状況が発生するたびに使用されます。

宣言されたインターフェイスには2つのレベルがあり、各レベルは次のように構成されています。最後のもの 国際IEEE公式標準委員会sedコマンド構文の予測可能な適用を保証します。sedAPI構文たとえば、この場合に/addressコマンドを/適用すると、sed s///(これは常に代替コマンドの最初のコンポーネントです。)ただし、同じコンテンツは、より基本的なAPIによって指定されたコンテンツのサブセットとして解釈されます。regcomp()機能する標準Cライブラリ

私はこの言葉を自信を持ってすることができます。sedなぜならいいえは単なるプログラムですが、sed私のUnix系コンピュータに名前が付けられたコンパイルされた実行可能ファイルは実装する明確に定義され、長く確立され、標準によって制御されます。sed アプリケーション私のシステムの正規表現マッチングライブラリです。


sed仕様から:

ユーティリティはsedサポートする必要がありますXBD基本正規表現...

...どこで見つけることができますか?

POSIX.1-2008 システムインタフェースボリュームの正規表現一致インタフェースは、BRE および ERE をサポートします。regcomp()regexec()と関連機能を提供します。

アプリケーションコールregcomp()それをレンダリングします模様文字列と...

...[これregcomp()関数は、指す文字列に含まれる正規表現をコンパイルする必要があります。模様引数を入力し、結果を構造体に入れます。プリプレグ...

これに関連する措置を講じるために、対応する申請書は以下を参照する。regcomp()コンパニオン機能...

...[これregexec()関数は、次のように指定されたnullで終わる文字列を比較します。ひもコンパイルされた正規表現の使用プリプレグ以前の呼び出しで初期化されましたregcomp()...

...regexec()[an]配列の要素は、部分文字列のオフセットで埋めなければなりません。ひもに該当\(括弧で囲まれたサブ式\)~の模様...模様それ自体はサブ式と見なされます。

...[これregexec()関数はすべての項目を入力する必要があります。マッチ主なポイントマッチ、どこマッチそしてマッチいくつかの要素があってもアプリケーションが提供マッチサブ式に該当しません。模様


だから私がこれをするとき...

/[^ ]* */

...sed最初編む正規表現を使用して結果をメモリに保存し、そこに保存されたコンパイルされた自動デバイスを、私のコマンドを満たすために必要なだけパターン領域の内容に適用します。各実行の結果は、1つ以上のnullで区切られた配列です。フィールド返されたオフセットから分離regexec()

私がこれをするとき...

//

...最も最近定義された正規表現を使用する必要があることを示しますsedregexec()プリコンパイルされた正規表現を再利用しますが、今回は変更された正規表現にも適用できます。ひも新しいものを表示または適用するマッチパラメータは私のコマンドに従います。

具体的には...

  • s/[^ ]* */[&]P/
    • 最初の項目を置き換える模様パターン空間では、[左角かっこが最初に来、次に右角括弧&]右角括弧、P文字が続きます。
  • s//&+pc/3
    • 最後に使用された正規表現を現在のパターン空間に再適用して、33番目の発生項目を置き換えます。模様パターン空間では、それ&自体の後に追加の文字列が続きます。+pc

したがって、すべてのsed入力行について標準出力に書き込んで、サンプルデータを提供します。

[2015-01   ]P5000   1000+pc
[2015-02   ]P6000   2000+pc
[2015-03   ]P7000   3000+pc

奇妙に思えるかもしれませんが、dc電卓は次のように引用します。ひも角かっこ間の入力では、コマンドは改行を追加せずにスタックPの上部を印刷してから、入力スタック\nからポップします。

したがって、dc最初の行を例にしてみましょう。

  • [2015-01 ]P
    • Pスタックトップの印刷とポップアップ
  • 5000
    • 数字を5000スタックの一番上にスライドさせ、現在のスタック内のすべての要素をプッシュします。(今は利用できません)一点下。
  • 1000
    • 上記と同じですが、今回はメインスタック上部の数字5000が1だけ下にプッシュされ、スタックの2番目の要素になります。
  • +
    • スタックの上部にある2つの数字を追加し、スタックから2つの数字をポップし、その合計をスタックの一番上にプッシュします。
    • これにより、数字のみを含むスタックが作成されます6000
    • スタックの上部にある2つの要素のうちの1つが文字列の[場合、]これは構文エラーです。
  • p
    • pスタックの一番上を印刷し、スタック\nから飛び出さずに追加されたewlineを印刷します。
  • c
    • cスタックの理解

関連情報