両方のファイルのデータを1つのファイルにマージし、列に興味深い値のみを追加します。検索キーは、3列のファイル#1のUIDです。また、UIDが重複して空白行がある場合は、削除/省略する必要があります。
どんな説明方法でも読んでみるのもいいと思います:)
FILE #1:
-----------------
SVCSTO1,dbsrv01,600507600C80012F4000000000000012
SVCSTO1,dbsrv01,600507600C80012F4000000000000014
SVCSTO1,dbsrv02,600507600C80012F40000000000001C0
SVCSTO1,dbsrv02,600507600C80012F40000000000001C1
SVCSTO1,dbsrv01,600507600C80012F40000000000001C2
SVCSTO1,winsrv01,600507600C80012F40000000000001C3
FILE #2:
-----------------
239,dbsrv01_01_T2,4398046511104,600507600C80012F40000000000001C2
240,winsrv01_03_T2,4398046511104,600507600C80012F40000000000001C3
10,dbsrv01_01_T0,0,8589934592000,600507600C80012F4000000000000014
237,dbsrv02_01_T1,4398046511104,600507600C80012F40000000000001C0
238,dbsrv02_02_T2,4398046511104,600507600C80012F40000000000001C1
8,dbsrv01_02_T0,8589934592000,600507600C80012F4000000000000012
DESIRED OUTPUT:
--------------------
SVCSTO1,dbsrv01,600507600C80012F4000000000000012,8589934592000,T0
SVCSTO1,dbsrv01,600507600C80012F4000000000000014,8589934592000,T0
SVCSTO1,dbsrv02,600507600C80012F40000000000001C0,4398046511104,T1
SVCSTO1,dbsrv02,600507600C80012F40000000000001C1,4398046511104,T2
SVCSTO1,dbsrv01,600507600C80012F40000000000001C2,4398046511104,T2
SVCSTO1,winsrv01,600507600C80012F40000000000001C3,4398046511104,T2
以下の例のようにデータ出力を操作できますが、配列を構築したり、複数の出力を1つにまとめたりする方法は経験がありません。
# for i in `cat file1.log | awk -F"," '{print $3}'` ; do cat file2.log | grep $i | awk -F"," '{print $3/1024^3" GB"}'; done
8000 GB
...
答え1
これはsed
入力を与えられた出力にのみ変換します。必要に応じて拡張できます。
sed -E '/^[0-9]/{s/.*_(.*)(,.*),(.*)/\3\2,\1/;H;d;};G;s/,(.*)\n.*\n\1(,[0-9]*,T[0-9]*).*/\1\2/' file2 file1
これらのタスクのアイデアは常に同じです。まず、2番目のファイルを読み取り、予約済みスペースにルックアップテーブルを作成し、次にルックアップテーブルをベースファイルの各行に追加します。
詳細:
- このパターンは
/^[0-9]/
数字で始まる行を扱うので、中のすべての内容が単純に{}
実行されます。file2
s/.*_(.*)(,.*),(.*)/\3\2,\1/
2番目のファイルから必要な部分だけが必要な順序で抽出されます。H;d
予約済みスペースのルックアップテーブルに追加し、行を削除します。その他の処理は、次の目的file1
にのみ使用されます。G
照会テーブルを追加し、照会テーブルの逆参照でキーs/,(.*)\n.*\n\1(,[0-9]*,T[0-9]*).*/\1\2/
(間,
および改行)を照会して、\1
テーブルにフィールドを追加します。
答え2
また、AWKを介してこの問題を解決する別の方法を見つけ、私のために働いています。
awk -F"," 'FNR==NR{a[$4]=$3 FS $2;next}{ print $0","a[$3]}' file1 file2