Как использовать awk или sed для преобразования CSV-диффов в более читаемый формат

Как использовать awk или sed для преобразования CSV-диффов в более читаемый формат

Может ли кто-нибудь привести пример того, как использовать awk или sed (не уверен, какой из них, так как я не особо пользовался ни одним из них, а в основном использовал grep и cut для работы с данными 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

в новом формате - первый столбец данных - это значение из первого столбца в обеих частях diff, для идентификации строки. Второй столбец содержит данные из первого csv-файла (старое значение), а третий столбец - это значение из второго csv-файла (новое значение).

Как выполнить такое преобразование текста с помощью awk или sed?

Спасибо.

решение1

Используйте awk с двумя ассоциативными массивами. Что-то вроде этого:

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

Если хотите, можете объединить все это в одну строку, разделив ее пробелами, но мне больше нравится многострочный текст. ;) Вот пример:

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, то, "< *"возможно, потребуется фиксированный шаблон, а не регулярное выражение, поэтому удалите *и вставьте буквальное количество пробелов после указателя направления.

Связанный контент