4

スペースで区切られたテキストファイルから列1、2、4、5、6、10、11、12を削除したいのですが、出力を印刷する代わりに、既存のファイルからこれらの列を削除したいと思います。sedでこれを行うにはどうすればよいですか?

MMMM   1522  KL1 PPP A 201      -7.299   41.933  48.192  1.00 31.52           G
MMMM     22  G   SSS A   3       39.541  25.078  -2.722  1.00 30.47           B  

必要な出力

KL1    -7.299   41.933  48.192
G       39.541  25.078  -2.722
4

4 に答える 4

8

sed理想的ではないでしょう。使用cut:

cut -d ' ' --complement -f -2,4-6,10-12 file.txt

編集:

コメントからの追加情報から:

< file.txt awk '{ print $3, $7, $8, $9 }' | column -t

結果:

KL1  -7.299  41.933  48.192
G    39.541  25.078  -2.722

ファイルを上書きするには、一時ファイルを使用する必要があります。

< file.txt awk '{ print $3, $7, $8, $9 }' | column -t > tmpfile && mv tmpfile file.txt
于 2012-12-05T06:04:10.447 に答える
2

これが実際のタスク (宿題ではない) である場合は、以下を使用することをお勧めしますawk

awk '{for(i=1;i<=NF;++i) if (i != 1 && i!=2 && i!=4 && i!=5 && i!=6 && i!=10 && i!=11 && i!=12) printf("%s ", $i);  printf("\n"); }' f.txt

または、列番号 3, 7, 8, 9 のみを印刷する必要がある場合:

awk '{print $3" "$7" "$8" "$9}' f.txt
于 2012-12-05T06:01:55.380 に答える
1

これはうまくいくかもしれません(GNU sed):

sed -r 's/^(\S+\s+){3}(\S+\s+){3}((\S+\s+){2}\S+).*/\1\3/' file

または、次のようにします。

sed -r 's/^\S+\s+\S+\s+(\S+\s+)\S+\s+\S+\s+\S+\s+(\S+\s+\S+\s+\S+).*/\1\2/' file

またはほとんどの sed バリエーションの場合:

sed -e 's/^[^ ][^ ]*  *[^ ][^ ]*  *\([^ ][^ ]*  *\)[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *\([^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\).*/\1\2/' file
于 2012-12-05T07:07:18.887 に答える
0
> echo "1 2 3 4 5 6 7 8 9 10 11 12"|perl -F -ane '$F[0]=$F[1]=$F[3]=$F[4]=$F[5]=$F[9]=$F[10]=$F[11]="";print "@F";'
  3    7 8 9

awkで:

echo "1 2 3 4 5 6 7 8 9 10 11 12" | awk '{$1=$2=$4=$5=$6=$10=$11=$12="";print}'
3    7 8 9 
于 2012-12-05T06:28:28.943 に答える