次の形式のファイルがあります。
$ 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
いくつかの方法があります:
別のawkメソッド
awk '{$2+=$3;}NF--' file
パール
perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
または
perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
シェル(上記よりはるかに遅いまたは効率が悪い)
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
コマンド構文の予測可能な適用を保証します。sed
API構文たとえば、この場合に/
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()
。
私がこれをするとき...
//
...最も最近定義された正規表現を使用する必要があることを示しますsed
。regexec()
プリコンパイルされた正規表現を再利用しますが、今回は変更された正規表現にも適用できます。ひも新しいものを表示または適用するマッチパラメータは私のコマンドに従います。
具体的には...
s/[^ ]* */[&]P/
- 最初の項目を置き換える模様パターン空間では、
[
左角かっこが最初に来、次に右角括弧&
、]
右角括弧、P
文字が続きます。
- 最初の項目を置き換える模様パターン空間では、
s//&+pc/3
- 最後に使用された正規表現を現在のパターン空間に再適用して、
3
3番目の発生項目を置き換えます。模様パターン空間では、それ&
自体の後に追加の文字列が続きます。+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
スタックの理解