awkを使用してCSVの列を切り替えますか? [コピー]

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

ただし、新しい行に3番目の列(最初の列)が表示されます。

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

awkがデータの3番目の列を新しい行に送信するのはなぜですか?私はWindowsのLinux Bash Shell(Ubuntu)でawkを使用しています。ここ

答え1

入力ファイルには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

16進出力では0a改行文字(\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.csvCLI ツールを使用してこのファイルを通常 Windows/DOS システムを構成するファイルに変換すると、変更されたファイルunix2dosold_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\nawk

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

関連情報