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

使用sed从文本文件中删除列,sed,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

我想从空格分隔的文本文件中删除第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
如果这是一项真正的任务(不是家庭作业),那么最好使用
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

sed
并不理想。使用
cut

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

根据评论中的其他信息:

< file.txt awk '{ print $3, $7, $8, $9 }' | column -t
要覆盖文件,您需要使用临时文件:

< file.txt awk '{ print $3, $7, $8, $9 }' | column -t > tmpfile && mv tmpfile file.txt
tmpfile&&mv tmpfile file.txt
在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 
这可能适用于您(GNU-sed):

或者:

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

第12栏之外还有其他栏吗?如果是,有多少?谢谢你的回答。你的代码不起作用。我想从现有文件中删除列。请帮助我。@lara:你能说得更具体一点吗?你的错误信息是什么?您的分隔符是单个空格、任意数量的空格还是制表符?代码工作正常。也许你应该在你的问题中加入一些示例输入。谢谢。可以从原始文件中删除列而不是打印输出吗?@lara:可以,我刚刚重新阅读了你的问题。请参见上面的编辑。您需要使用临时文件,因为
awk
不像
sed
那样提供就地编辑。
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 
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 -e 's/^[^ ][^ ]*  *[^ ][^ ]*  *\([^ ][^ ]*  *\)[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *\([^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\).*/\1\2/' file