如何使用 awk 或 sed 將 csv diff 轉換為更易讀的格式

如何使用 awk 或 sed 將 csv diff 轉換為更易讀的格式

任何人都可以給我一個如何使用 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,則"< *"可能需要是固定模式而不是正則表達式,因此丟失*並在方向指示符後面放入字面量的空格。

相關內容