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