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