2016-11-08 3 views
0

タブを含むデータセットで作業しようとしていますが、最後の列にはユーザーがタブを含むカスタムテキストを入力できるカスタムフィールドがあります。今、私はAWKは最後の列のタブを条件に置き換えます

awk "/\t/{c++;if(c==7){sub(\"\t\",\"\");c=0}}1" users10000.csv >users10000awk.csv 

を使用してこれらのタブを削除しようとしているが、第七が空である第六と第七柱の間にはデリミタがないように思えます。

私が今やろうとしていることは、最後のフィールドが

awk /\t/{c++;if((c==7) && ($12!=\"\")){sub(\"\t\",\"\");c=0;}}1 usersorig.csv >usersorigawk.csv 

て空でない場合は7日後に発見されたタブを交換するだけであるが、これは

){sub(\"\t\" was unexpected at this time. 

が、私は」エラーになりますAWKを完全に新しくして、それを簡単に動かすことを望んでいましたが、フォーマットは慣れる苦痛です。あなたが助けることができるどんなチャンスですか?

サンプル入力:

100008949 esttrellitta 264 44 6853 0 28 Dec 2009 18:01:42 GMT El Paso,Tx. 
100009841 ChelseaBex 152 50 394 0 28 Dec 2009 18:05:43 GMT  
100012792 ErinPattisonn 984 666 5003 0 28 Dec 2009 18:19:39 GMT under your bed. 
100013967 TUBeautifulRosa 323 251 1269 0 28 Dec 2009 18:24:51 GMT on Twitter ....... ahaahaa ! 
100014135 GeenaJohnson 144 130 9789 0 28 Dec 2009 18:25:37 GMT Arkansas 
100015928 GooSau 93 286 8075 0 28 Dec 2009 18:33:59 GMT  
10001882 rjwilson 1 340 6358 0 6 Nov 2007 15:54:47 GMT iPhone: 39.053871, 95.674576 
100019750 HovMinajJackson 135 136 6022 0 28 Dec 2009 18:51:29 GMT neverland 
100020433 MattieBX 131 97 2610 0 28 Dec 2009 18:54:40 GMT zundert 
100024321 KatieStepek 64 93 503 0 28 Dec 2009 19:13:08 GMT Hamilton 
137179909 LaLovesU 431 499 19568 0 26 Apr 2010 01:45:05 GMT Oakland,\ CA 

最後の行は、私が編集したいの犯人の一つです。

+2

追加行でタブ区切りファイルの行に、この作業を行うには、タブ

UPDATE

を使用していることを強調するために、明瞭さのためのサンプル入力と出力、そして他の人がソリューションをテストするために – Sundeep

+1

私の悪い!例と手元の問題を編集しました。 – user3394131

+0

最後のフィールドは '$ NF'で参照できます。 – fedorqui

答えて

0

awk溶液です。私はタブがあなたが与えた例で真であるフィールドセパレータであると仮定しました。セパレータがタブまたはスペースのいずれかになる場合は、awk split関数を使用する必要があります。

awk -F'\t' '{ 
    for (i=1; i < NF; i++) {  # iterator and print 
     if (i < 7) { 
      printf("%s ", $i) # for <7 column, print space as separator 
     } else { 
      printf("%s\t", $i) # for 7+ column, print as it is with tab 
     } 
    } 
    print ""      # print new line - record separator 
}' 

ワンラインソリューション:

awk -F'\t' '{for (i=1; i < NF; i++) { if (i < 7) { printf("%s ", $i) } else { printf("%s\t", $i)} }print ""}' 
1

おそらくこれが何をしたいのですか?

$ seq 10 | paste -sd'\t' 

1  2  3  4  5  6  7  8  9  10 

$ seq 10 | paste -sd'\t' | sed 's/\t/ /7g' 

1  2  3  4  5  6  7 8 9 10 

私はgnu-sedだけがこれをサポートしていると思います。またd'\t'がすでにデフォルトであることを、注意してくださいちょうど私たちが

$ sed 's/\t/ /7g' input.file > output.file 
+0

私はこれを試してみるためにLinuxをインストールしました。なぜなら、これは私が必要とするものだからです。今はseq 10の代わりに入力ファイルを使用しようとしています。私はやろうとしています 'paste -sd '\ t' | sed 's/\ t// 7g' inputfile.txt> outputfile.txt' しかし、それが動作しない、コマンドは完了しません – user3394131

関連する問題