web-dev-qa-db-ja.com

awkを使用してファイルから、またはLinuxのコマンドラインから列を削除する

awkでタブ区切りフィールドファイルからいくつかの列を削除するにはどうすればよいですか?

c1 c2 c3 ..... c60

たとえば、列を削除しますbetween 3 and 29。

21
user951487

これは、cutコマンドの目的です。

cut -f1,2,30- inputfile

デフォルトはタブです。 -dスイッチで変更できます。

42

すべての列をループして、不要な列を除外できます。

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

NFは、レコード内のフィールドの総数を示します。
条件を満たす列ごとに、列に続いてスペースを印刷します" "


編集:johnnyの発言後に更新:

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つの方法で改善されています。

  • 元のセパレータを保持します
  • 最後にセパレータを追加しません
11
oliver
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
1
Steven Penny

先頭または末尾の空白を追加しないPerl「スプライス」ソリューション:

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

出力を生成します。

c1 c2 c30 c31
0
Chris Koknat