使用sed从文本文件中删除列

时间:2012-12-05 05:51:10

标签: sed

我想从空格分隔的文本文件中删除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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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