-1

ファイル1

a,b, c, d,session-111, e, f
p,f, y, j,session-222, e, o
p,e, c, j,session-333, e, r
t,y, u, j,session-444, r, r
t,y, u, j,session-555, e, w
e,g, m, j,session-555, e, m
e,e, m, j,session-555, e, m

ファイル2

session-111, data-123, 123, erwt
session-222, data-234, 345, fghjf
session-333, data-345, 456, aasdf
session-555, data-567, 789, aasdf
session-555, data-890, 121, aasdf
session-666, data-678, 121, aasdf

出力

a,b, c, d,session-111, e, f, data-123, 123
p,f, y, j,session-222, e, o, data-234, 345
p,e, c, j,session-333, e, r, data-345, 456
t,y, u, j,session-444, e, r, NODATA
t,y, u, j,session-555, e, r, date-567, 789
t,y, u, j,session-555, e, r, date-890, 121
e,e, m, j,session-555, e, m, NODATA

file1のすべてのデータを印刷する必要があります-file2に参照が見つかったかどうかに関係なく、ファイル2に参照が見つかった場合、特定のフィールド(フィールド2と3)が出力ファイルに連結されます

4

2 に答える 2

1

このワンライナーを試してみてください:

awk -F, 'NR==FNR{k[$1]=$2 OFS $3;next} {if($5 in k)print $0,k[$5];else print $0," NODATA"}'  OFS="," file2 file1
a,b, c, d,session-111, e, f, data-123, 123
p,f, y, j,session-222, e, o, data-234, 345
p,e, c, j,session-333, e, r, data-345, 456
t,y, u, j,session-444, r, r, NODATA
t,y, u, j,session-555, e, w, data-890, 121
e,g, m, j,session-555, e, m, data-890, 121
e,e, m, j,session-555, e, m, data-890, 121
于 2013-02-14T09:25:25.430 に答える
1

私が正しく理解している場合は、file1のフィールド5と1をそれぞれfile2に順番に一致させたいと考えています。一致しない場合は、代わりに「NODATA」フィールドを使用する必要があります。以下はあなたが望むものに近づいています、私はあなたのリストされた出力にいくつかのエラーがあると思います、sudo_Oによってなされたコメントを見てください:

parse.awk

BEGIN { FS = OFS = "," }
FNR == NR { 
  lines[$1][++count[$1]] = $2 FS $3
  next
} 

count[$5] == 0 { print $0, " NODATA" } 
count[$5]  > 0 {
  count[$5]--
  print $0, lines[$5][++prn[$5]]
}

次のように実行します。

awk -f parse.awk file2 file1

出力:

a,b, c, d,session-111, e, f, data-123, 123
p,f, y, j,session-222, e, o, data-234, 345
p,e, c, j,session-333, e, r, data-345, 456
t,y, u, j,session-444, r, r, NODATA
t,y, u, j,session-555, e, w, data-567, 789
e,g, m, j,session-555, e, m, data-890, 121
e,e, m, j,session-555, e, m, NODATA
于 2013-02-14T09:36:41.647 に答える