Text-Processing
使用awk切換CSV中的列?
我在這裡有和這個完全相同的問題。唯一的區別是我只有 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