任何人都可以给我一个如何使用 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
采用新格式 - 第一列数据是差异的两个部分中第一列的值,用于标识该行。第二列包含第一个 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,则"< *"
可能需要是固定模式而不是正则表达式,因此丢失*
并在方向指示符后面放入字面量的空格。