Text-Processing

使用awk切換CSV中的列?

  • August 8, 2018

我在這裡有和這個完全相同的問題。唯一的區別是我只有 3 列,我試圖將第一列移到最後。

原始文件如下所示:

col1,col2,col3
2,2015-01-04,23
196,2015-01-20,36

我沒有犯其他提問者犯的錯誤(即不在 F 或 OFS= 之後加逗號)。所以,我的程式碼是

awk -F, '{print $2,$3,$1}' OFS=, old.csv > new.csv

但是我在新行中獲得了第三列(曾經是第一列):

col1,col2,col3
2015-01-04,23
,2
2015-01-20,36
,196

為什麼 awk 將第三列數據發送到新行?我在 Windows 上的 Linux Bash Shell (Ubuntu) 上使用 awk,從這裡下載。

您的輸入文件中似乎有一些附加數據,例如 DOS 樣式的換行符 ( \r\n),而通常在 Unix 系統上,這些文件只有\n.

例如:

$ cat old.csv
col1,col2,col3
2,2015-01-04,23
196,2015-01-20,36

我們可以hexdump用來查看這個文件的實際 ASCII:

$ hexdump -C old.csv
00000000  63 6f 6c 31 2c 63 6f 6c  32 2c 63 6f 6c 33 0a 32  |col1,col2,col3.2|
00000010  2c 32 30 31 35 2d 30 31  2d 30 34 2c 32 33 0a 31  |,2015-01-04,23.1|
00000020  39 36 2c 32 30 31 35 2d  30 31 2d 32 30 2c 33 36  |96,2015-01-20,36|
00000030  0a                                                |.|
00000031

請注意0a在 HEX 輸出中,這是一個換行符 ( \n)。如果我基本上使用你awk的這個文件,它會按預期工作:

$ awk -F, '{print $2,$3,$1}' OFS=, old.csv
col2,col3,col1
2015-01-04,23,2
2015-01-20,36,196

如果我們old.csv使用 CLI 工具將文件轉換為通常形成 Windows/DOS 系統unix2dos的文件,則修改後的文件old_dos.csv如下所示:

$ hexdump -C old_dos.csv
00000000  63 6f 6c 31 2c 63 6f 6c  32 2c 63 6f 6c 33 0d 0a  |col1,col2,col3..|
00000010  32 2c 32 30 31 35 2d 30  31 2d 30 34 2c 32 33 0d  |2,2015-01-04,23.|
00000020  0a 31 39 36 2c 32 30 31  35 2d 30 31 2d 32 30 2c  |.196,2015-01-20,|
00000030  33 36 0d 0a                                       |36..|
00000034

現在我們看到0d&0a這是一個\r\n. 在這個文件上使用awk的行為很奇怪:

$ awk -F, '{print $2,$3,$1}' OFS=, old_dos.csv
,col1col3
,215-01-04,23
,196-01-20,36

引用自:https://unix.stackexchange.com/questions/461180