0

価格の異なる重複アイテムの大規模なリストを含むCSVファイルがあり、ファイルが並べ替えられています。すべての複製アイテムを比較し、どの複製アイテムが最低価格であるかを確認してから、最低価格の複製アイテムを新しいファイルにエクスポートしたいので、フィールドはコンマで区切られているため、元のCSVファイルは次のようになります。

01、banana、7.00
01、banana、6.00
01、banana、7.00
01、banana、9.00
02、mango、5.00
02、mango、3.00
02、mango、3.00
02、mango、4.00

出力CSVファイルは

01、バナナ、6.00
02、マンゴー、3.00

私は現在bashでコーディングしていて、awkがこれを実行できるかどうか疑問に思っていました。

4

2 に答える 2

1
awk '!($1" "$2 in x) || x[$1" "$2] > $3 {x[$1" "$2] = $3}
     END {for (item in x) print item, x[item]}' file.txt
  • $1" "$2==スペースで接続された最初の2列
  • !(... in x)==は...配列内のキーとして見つかりませんxか?
  • x[...] > $3==はx列3より大きい...要素です

したがって、アイテム番号+名前がxに見つからない場合、または保存された価格が現在の行よりも大きい場合は、中かっこでコードを実行します。

  • {x[...] = $3}==価格を...要素として保存しますx

で、のENDすべてのアイテムをループしx、アイテムと節約された価格を印刷します。

于 2013-03-07T08:11:17.963 に答える
0

ファイルは並べ替えられている(キーでグループ化されている)ので、これを試してメモリを節約し、順序を維持することができます。

awk '
  p!=$1 OFS $2 {
    if(p)print p,v
    p=$1 OFS $2
    v=$3
    next 
  } 
  $3<v {
    v=$3
  } 
  END{
    print p,v
  }
' FS=, OFS=, file

または、$ 1が一意のキーである場合は、これを試すこともできます。

awk '
  p x!=$1 {
    if(p x)print s
    p=$1
    s=$0
    v=$3
    next 
  } 
  $3<v {
    v=$3
  } 
  END{
    print s
  }
' FS=, file 

注:引用符で囲まれたフィールドを含むcsvファイルの場合、スクリプトはより複雑になる必要があります。

于 2013-03-07T10:27:41.813 に答える