2016-08-05 3 views
2

私はこのコンテンツでcsvファイルを持っている:cat、sed、awk、cutを使用してcsvファイルの特定の位置に列を追加するにはどうすればよいですか?

col1, col2, col5 
    1, 1, 1 
    2, 2, 2 
    3, 3, 3 
    4, 4, 4 

は、私は、ヘッダーとファイルの3番目の位置ではなく、空の値を持つ列を追加する必要があります。

col1, col2, col3, col4 
1, 1,  , 1 
2, 2,  , 2 
3, 3,  , 3 
4, 4,  , 4 

cat、sed、awk、cutなどのLinuxコマンドを使用する方法はありますか?

私はcutを使ってファイルをcut -d、-f1,2,3 file1> file2のように変更できることを知っています。しかし、それはカスタム列を追加するオプションがないようです。

ご協力いただければ幸いです。

+0

@Inianありがとうございます。私はちょうど私がカットコマンドで試したことを追加しました。しかし、カスタム列を追加する方法はありません。 – ebertbm

+0

元のファイルに誤字があります。最初は 'col5'、後で' col4'です。 – Inian

答えて

5

これは、ロジックは単純明快である

私はあなたが(最後に> newfile)リダイレクト演算子を使用して、新しいファイルに書き込むことができawk

$ awk -v FS=',' -v OFS=',' 'BEGIN{print "col1, col2, col3, col4"} NR>1{k=$3; $3="\t"; $4=k; print $0}' newfile 
col1, col2, col3, col4 
    1, 1, , 1 
    2, 2, , 2 
    3, 3, , 3 
    4, 4, , 4 

で行うことができる最高です -

  • -v FS=',' -v OFS=','コンマ(,)への入力および出力フィールドセパレータを設定
  • BEGIN{print "col1, col2, col3, col4"}更新された列名を持つ新しいヘッダを作成し、awkBEGINブロックを覚えてNR>1{k=$3; $3="\t"; $4=k; print $0}は、バックアップを取って、元のファイルからヘッダーをスキップしています、awk<action>の部分については、ファイル
  • の実際の処理の前に実行されますkの3番目の列の値を上書きし、空のtab-spaceおよび4番目の列に置き換えると、古い3番目の列の値として復元されます。

コメントにはfedorquiの別のクールな提案があります。これは次の簡単な方法でもできます。

$ awk 'BEGIN {FS=OFS=","} NR==1{$0="col1, col2, col3, col4"} NR>1{$3=sprintf("\t,%s",$3)}1' file 
col1, col2, col3, col4 
    1, 1, , 1 
    2, 2, , 2 
    3, 3, , 3 
    4, 4, , 4 
+0

'print $ 0'は不要です。 'NR> 1 {things} 1'と言うだけで' 1'が印刷動作をトリガします。 – fedorqui

+0

@fedorqui:キャッチしてくれてありがとう!私はすでにそれを試して、ヘッダー部分をスキップして、 '{もの} 'の中でいくつかのローカルアクションを実行していることに気付きました。そして、{1}を実行すると、ファイル内容全体を出力します。 – Inian

+1

さて、 'NR == 1 'をスキップして' BEGIN'ブロックに印字するのはちょっと変です。私は 'awk'を使用します。BEGIN {FS = OFS = "、"} NR == 1 {$ 0 = "col1、col2、col3、col4"} NR> 1 {$ 3 = sprintf( "\ t、%s"、$ 3 )} 1 'ファイル'。必要に応じてフォーマットするための 'sprintf'の使い方に注意してください。 – fedorqui

1
$ awk -v f=3 'BEGIN{FS=OFS=","} {$f = (NR>1?"":"col"f) FS $f} 1' file 
col1,col2,col3,col4 
1,1,,1 
2,2,,2 
3,3,,3 
4,4,,4 

以上、このファイルに実行されました:

$ cat file 
col1,col2,col4 
1,1,1 
2,2,2 
3,3,3 
4,4,4 

本当にスペースが質問ショーのような最初の列の前に存在する場合は...

0

を味わうために空白を追加、それを悪用しよう:

$ awk -F"(,* +)" '{for(i=j=1; ++j<NF; i++) $i=$j; $i=""} NR==1 {$3="col3"; OFS=","} 1' file 
col1,col2,col3,col5 
1,1,,1 
2,2,,2 
3,3,,3 
4,4,,4 

そうでない場合:

$ awk '{$(NF+=1)=$NF; $(NF-1)=(NR==1?"col3":"")","} 1' flie 
col1, col2, col3, col5 
1, 1, , 1 
2, 2, , 2 
3, 3, , 3 
4, 4, , 4 
関連する問題