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