私はこれと同じ問題がありますここ。唯一の違いは、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.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