awkまたはsedを使用してcsv diffをより読みやすい形式に変換する方法

awkまたはsedを使用してcsv diffをより読みやすい形式に変換する方法

誰もが awk または sed を使用する方法の例を提供できますか (主に csv データに grep と cut を使用するため、どちらを使用しなかったかわからない) 2 つの違いを変換します。 .csvファイルはより読みやすいファイルです。

たとえば、古い.csvファイルと新しい.csvファイルの違いを生成した場合、実際には多数の列がより複雑になる可能性があります。

2,3c2,3
< Barbara,1093,19
< Magdaline,2093,20
\ No newline at end of file
---
> Barbara,1011,19
> Magdaline,12093,20
\ No newline at end of file

この形式にどのように変換できますか?

Barbara  1093 1011 
Magdaline 2093 12093

新しい形式では、データの最初の列は、行を識別する2つの差分部分の最初の列の値です。 2番目の列には最初のcsvファイルのデータ(以前の値)が含まれ、3番目の列には2番目のcsvファイルの値(新しい値)が含まれています。

awkまたはsedでこれらのテキスト変換をどのように実行できますか?

ありがとうございます。

答え1

2 つの連想配列で awk を使用します。このような:

awk -F, '
  /^</{sub("< *","",$1);old[$1]=$2}
  /^>/{sub("> *","",$1);new[$1]=$2}
  END{ for(k in old) print k,old[k],new[k] }
'

必要に応じて、すべてをスペースで区切って1行にリンクできますが、私は複数行を好みます。 ;) 以下は例です。

sauer@humpy:~$ cat file
< a,b,c
> a,d,e
gibberish
< 1,2,3
> 1,4,5
sauer@humpy:~$ awk -F, '
  /^</{sub("< *","",$1);old[$1]=$2}
  /^>/{sub("> *","",$1);new[$1]=$2}
  END{ for(k in old) print k,old[k],new[k] }
' < file
a b d
1 2 4

ああ、古いawkがある場合は、"< *"正規表現の代わりに固定パターンが必要になる可能性があるため、方向インジケータの後ろのリテラル*にスペースを失って入れてください。

関連情報