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 回答