2

私はawk/sedを使うのが本当に初めてです

だから、私は次の情報を持っているperformance.logと呼ばれるテキストファイルを持っています

CPU 1 2 3 4 5 6
RAM 2 3 4 5 6 7
HAR 3 4 5 6 7 8

そして、performance-eval.shのコードで、関数は次の情報を生成します

Cur_CPU=10
Cur_RAM=11
Cur_HAR=13

Cur_CPU、RAM、HARをperformance.logに挿入して保存したい。Cur_CPUは最初の行に移動し、2番目の列Cur_RAMは2番目の行に移動し、2番目の列Cur_HARは3番目の行、2番目の列に移動します

結果として得られるperformance.logは次のようになります。

CPU 10 1 2 3 4 5 6
RAM 11 2 3 4 5 6 7
HAR 13 3 4 5 6 7 8

3つの異なる列に3つの異なる値を追加する方法がわかりません。ご協力いただきありがとうございます!

4

2 に答える 2

1

最も簡単な解決策はjoinコマンドを使用することですが、最初に追加情報を生成する関数の出力を処理する必要があります。

function | sed -e 's/^Cur_//;s/=/ /' | sort > myfile2.txt
join myfile2.txt myfile1.txt -1 1 -2 1

Cur_まず、各行の先頭からを削除してから=、スペース文字に置き換えます。また、join は、両方の入力が適切にソートされていることを期待しています。

この-1 1引数は、最初のファイルの最初のフィールドを結合フィールドとして使用する必要があることを join に伝えます。同様に-2 1、2 番目のファイルには最初のフィールドも使用する必要があることを join に伝えます (一部の実装では、単一のに短縮できるため-N 1、両方のファイルに最初のフィールドを使用します)。

join フィールドは次のように使用されます。join が最初のファイルで 2 番目のファイルの行と同じ結合フィールドを持つ行を見つけると、出力にはマージされた行が含まれます。コマンド ラインでのファイルの順序は、最終出力のフィールドの順序にとって重要であることに注意してください。

これが役立つことを願っています=)

于 2012-10-11T15:29:04.253 に答える
0

これが方法awkです:

$ cat output 
Cur_CPU=10
Cur_RAM=11
Cur_HAR=13

$ cat perf.log 
CPU 1 2 3 4 5 6
RAM 2 3 4 5 6 7
HAR 3 4 5 6 7 8

$ awk 'NR==FNR{split($0, fld, /=|_/);a[fld[2]] = fld[2] FS fld[3];next}
($1 in a){$1 = a[$1]}1' output perf.log 
CPU 10 1 2 3 4 5 6
RAM 11 2 3 4 5 6 7
HAR 13 3 4 5 6 7 8
于 2014-02-28T21:06:31.967 に答える