2016-04-01 28 views
0

私はawkの絶対初心者です。awk特定のフィールドが一致すると行が追加されます

は、私はこのデータを持っている:

FOO|BAR|1234|A|B|C|D| 
FOO|BAR|1234|E|F|G|H| 
FOO|BAR|5678|I|J|K|L| 
FOO|BAR|5678|M|N|O|P| 
FOO|BAR|5678|Q|R|S|T| 

所望の出力:

FOO|BAR|1234|A|B|C|D|E|F|G|H| 
FOO|BAR|5678|I|J|K|L|M|N|O|P|Q|R|S|T| 

を基本的に私は、列3試合のラインにいくつかのフィールドを追加する必要があります。

ありがとうございました。

+0

それを印刷する必要があり、再起動| XYZ | 5678 | D | C | B | A | 'が最後に追加されました。 'D | C | B | A | 'をサンプル出力の最後の行に追加するか、新しい出力行にする必要がありますか?別の言い方をすれば、質問が現時点で言うように3列目であると確信しているのですか、より説得力のある「最初の3列」を意味しますか? –

+0

処理中:パイプ記号で分割。列3に古い値の記録を残す。古い値と現在の値が同じ場合は、現在の行に列4-7を追加します。古い値と現在の値が異なる場合は、古い行(存在する場合)を印刷し、古い値を3列目に設定し、後で追加できるように現在のレコードを保存します。 –

+0

'FOO | BAR | 5678 | I | J | K | L | M | N | O | P | Q | R | S | T | D | C | B | A' - 余分な線が追加されます。私が扱っているデータには、同じ値を持つこれらのフィールドがあります。 – BlueHam

答えて

1

別の方法:

awk -F"|" '$3 in a{ 
    a[$3]=a[$3]"|"$4"|"$5"|"$6"|"$7; 
    next 
} 
{ a[$3]=$0 
} 
END { 
    for (i in a) { 
     print a[i] 
    } 
}' 
1
$ awk -f chain.awk < data 
FOO|BAR|1234|A|B|C|D|E|F|G|H| 
FOO|BAR|5678|I|J|K|L|M|N|O|P|Q|R|S|T| 
$ cat chain.awk 
BEGIN {FS = "|"} 
$3==old {for(i = 4; i <= NF; i++) saved = saved (i>4?"|":"") $i} 
$3!=old {if(old) print saved ; saved = $0 ; old = $3} 
END  {print saved} 
$ 
  • BEGIN我々は最初のもの(を除い|でフィールドに入社、保存されたデータに$4 ... $NFフィールドを追加するフィールドセパレータ
  • $3==oldを設定最後の空フィールドがあることに注意してください)
  • $3!=old私たちはs aved(最初のレコードを除いて、oldはfalse)のデータと我々はまだ私達のお腹の中でデータを保存したメカニズム
  • ENDが、私たちは余分なライン `PQRを想定
関連する問題