2011-09-26 4 views
21

タブで区切られたフィールドファイルからいくつかの列を削除するにはどうすればよいですか?awk?例えばawkまたはコマンドラインからのファイルを列から削除する

c1 c2 c3 ..... c60 

、 3と29との間の列を削除します。

+0

stackoverflowの上のこの答えはあなたを助けることがあります。http://stackoverflow.com/questions/2626274/awk-print-all-other-columns-but-not-1-2-and-3 – iwg

答えて

11

あなたはしたくないものすべての列をループしてフィルタリングすることができます。

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 

NFはあなたのレコードのフィールドの合計数を示します。
条件を満たす各列について、列を印刷した後に空白" "を続けて印刷します。


EDIT:ジョニーから発言後に更新:

awk -F 'FS' 'BEGIN{FS="\t"}{for (i=1; i<=NF-1; i++) if(i<3 || i>5) {printf $i FS};{print $NF}}' input.txt 

これは2つの方法で改善される。

  • は、元のセパレータ
  • は、端部にセパレータを追加しない保持
+0

べきではありませんスペースの代わりにタブ(\ t)を表示します。彼はフィールドを削除したい、おそらく同時に(私はあなたを正しく理解している)タブを削除しない。 – johnny

+0

@johnny:そうです。私は、セパレータを正しく認識するようにコードを更新しました。 – oliver

41

これはcutコマンドの対象:

cut -f1,2,30- inputfile 

デフォルトはタブです。 -dスイッチでそれを変更することができます。空白を先頭または末尾に追加されることはありません

+0

Ubuntuで動作させるために最後の '-'を削除しなければなりませんでした。私がそれを残すと、 'cut'はすべての列を出力します。誰もこの問題を抱えていましたか? –

+0

最後のもの(質問の60)まで1,2、および30の列を印刷する必要があります。もしそれがUbuntuのバグでなければ! –

+0

Aaaah、ok。私が間違えました。私の悪い。 –

1
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1' 

入力

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 

出力

c1 c2 c16 c17 c18 c19 c20 c21 
+0

これは列を削除しません。それはそれらを空白にし、reprints ... OPの指定された 'O * FS'の' \ t 'は、彼らが求めていない単一のスペースで置き換えられます。 _apparent_削除は偶然であり、 'FS'と' OFS'をデフォルトの '\ s +'にする必要があります。 OPの '\ t'と互換性のない、かなり駄目なセパレータです。ファイルが偶然に空のフィールドを持つことができない場合を除き、ぎざぎざの行に詰め込まれます。他のセパレータ。 OPの '\ t'は、依然として望ましくない列を持つ出力を返しますが、空になります。そして、 '$ 0 = $ 0'は冗長で無駄かもしれません。文書を再構築する方法は、 '$ 1 = $ 1'です –

0

Perlのスプライス」ソリューション:

perl -lane 'splice @F,3,27; print join " ",@F' file 

は出力を生成します。

c1 c2 c30 c31 
関連する問題