web-dev-qa-db-ja.com

awkで列を追加する際の問題

以下を使用して、csvファイルに列を追加しようとしています。

awk -F "," '{print $0"new_col"}' file.csv

しかし、私は得ました:

new_col8,0.405,0.101
new_col4,0.374,0.100
new_col23,0.342,0.100
new_col130,0.298,0.100

の代わりに :

68,110,0.362,0.101,new_col
11,98,0.405,0.101,new_col
57,94,0.374,0.100,new_col
61,123,0.342,0.100,new_col
124,130,0.298,0.100,new_col

私もこのように試しました:

awk -F "," '{{$(NF+1)=",new_col"} print $0 }' file.csv

しかし、私は同じ結果を得ました!!!

誰かがすでにこの問題を抱えていますか?

.csvはDOS形式であり、別のオプションは次のようになります。

tr -d \\r <input.csv | sed 's/$/,new_col/'

...すべてを1回で処理します。

0
mikeserv

入力csvファイルはDOS形式です。 Microsoft DOS/Windowsは、キャリッジリターン(\r^M、ASCII code 13)、続いて改行(\n^JまたはASCII code 10))を使用します。 Linux/Unixはラインフィードのみを使用しますが、各行の終わり。

これを修正するには、次を実行します。

$ dos2unix file.csv
dos2unix: converting file file.csv to Unix format ... 
$ awk '{print $0",new_col"}' file.csv

new_colの前のコンマに注意してください。これがないと、printnew_col$0の末尾に直接連結します。入力行をフィールドに分割していないため、フィールド区切り文字(-F)を示す必要はありません。使用しているのは$0のみです。

3
garethTheRed

これは機能しますか? awk -F, '{$(NF+1)="new_col";}1' OFS=, input.txt

これにより、コマンドラインに新しいテーブルが出力されます。この例では、出力ファイル(output.csv 念のため)。

コマンドを実行する前に:

$ cat input.csv
68,110,0.362,0.101
11,98,0.405,0.101
57,94,0.374,0.100
61,123,0.342,0.100
124,130,0.298,0.100

コマンドの実行:

$ awk -F, '{$(NF+1)="new_col";}1' OFS=, input.csv > output.csv

出力ファイルの確認:

$ cat output.csv
68,110,0.362,0.101,new_col
11,98,0.405,0.101,new_col
57,94,0.374,0.100,new_col
61,123,0.342,0.100,new_col
124,130,0.298,0.100,new_col

サンプルページ

0
Simply_Me