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