删除带有awk或sed的列

删除带有awk或sed的列,sed,awk,Sed,Awk,我有一个有三列的文件。我想删除第3列(就地编辑)。如何使用awk或sed执行此操作 123 abc 22.3 453 abg 56.7 1236 hjg 2.3 期望输出 123 abc 453 abg 1236 hjg 看来你可以跟我一起去 awk '{print $1 " " $2}' file 这将打印输入文件中每行的前两个字段,用空格分隔。这可能适合您(GNU-sed): 如果要删除第三个字段前的空白: sed -i -r 's/(\s+)?\S+//3' f

我有一个有三列的文件。我想删除第3列(就地编辑)。如何使用awk或sed执行此操作

123   abc  22.3
453   abg  56.7
1236  hjg  2.3
期望输出

123  abc
453  abg
1236 hjg 

看来你可以跟我一起去

awk '{print $1 " " $2}' file
这将打印输入文件中每行的前两个字段,用空格分隔。

这可能适合您(GNU-sed):

如果要删除第三个字段前的空白:

sed -i -r 's/(\s+)?\S+//3' file
试试这个:

awk '$3="";1' file.txt > new_file && mv new_file file.txt

试试这个简单的东西:

awk '!($3="")' file

使用GNU awk进行就地编辑,
\s/\s
,并删除

1) 第一个字段:

awk -i inplace '{sub(/^\S+\s*/,"")}1' file

2) 最后一个字段:

awk -i inplace '{sub(/\s*\S+$/,"")}1' file

3) N=3的第N个字段:

awk -i inplace '{$0=gensub(/\s*\S+/,"",3)}1' file

没有GNU awk,您需要一个
match()
+
substr()
组合或多个
sub()
s+vars来删除中间字段。另请参见。

尝试使用切割。。。它又快又容易

首先,你有重复的空格,如果你想用
tr-s'


如果每一列之间已经只有一个分隔符,那么您可以使用
cut-d'-f-2
打印字段(列)如果您对Perl解决方案持开放态度

perl -ane 'print "$F[0] $F[1]\n"' file
使用以下命令行选项:

  • -n
    循环输入文件的每一行,不要自动打印每一行

  • -a
    自动拆分模式–将输入行拆分为@F数组。默认为按空格拆分

  • -e
    执行以下perl代码


@poton,是不是
\S
表示所有不是空格的字符?记录在哪里?什么是
-r
做的?我的sed没有它。@joshuacheck
-r
是GNU sed特定的选项,用于启用ERE(谷歌)。如果您使用
-E
而不是
-r
,它将在GNU sed和一些其他sed中工作。@GillesQuenot是的,没错。您可以在GNU手册的上一节中看到它的文档;它将其设置为空字符串,但您仍然会在输出中获得额外的
FS
。这可能很重要,也可能不重要,这取决于您对转换的数据所做的操作。请尝试将生成的输出保存到新文件中。啊!($3=“”)文件>newfile@A.Danischewski这不是一个好方法,如果awk脚本有错误会发生什么?你的档案丢了。以这个
awk'..”文件>tmp和&mv tmp文件为例,还有其他可能影响的情况:如果文件系统存在空格问题怎么办?这也将重新编译当前记录,用单个空白字符替换字段之间的所有空格,并删除任何前导和/或尾随空格。鉴于其发布的输入,它不会产生OPs所需的输出。要做到这一点,您需要。这假设只有3列。否则您将需要一个循环:
awk'{printf$1 of s$2;for(i=4;iNote:Ubuntu上值得信赖的GNU Awk 4.0.1默认情况下没有启用
Awk
inplace扩展。@technomage我在回答中没有使用sed,也许你是想对其他答案发表评论,但如果你是这样想的话,请说出Awk而不是sed,我在回答中已经说过你需要GNU Awk。另外,
[]
[^]
不是手册页上所说的
\s
\s
的等价物。我感到困惑:我开了一个悬赏推广埃德·莫顿的答案,到目前为止,这几天的帖子一直是个问题,没有显示任何研究
(@@@@)
awk -i inplace '{sub(/\s*\S+$/,"")}1' file
awk -i inplace '{$0=gensub(/\s*\S+$/,"",1)}1' file
awk -i inplace '{$0=gensub(/\s*\S+/,"",3)}1' file
cat input.txt | tr -s ' ' | cut -d ' ' -f-2
cat input.txt | tr -s ' ' | cut -d ' ' --complement -f3
Each LIST is made up of one range, or many ranges separated by commas.
Selected input is written in the same order that it is read, and is
written exactly once. Each range is one of:

  N     N'th byte, character or field, counted from 1
  N-    from N'th byte, character or field, to end of line
  N-M   from N'th to M'th (included) byte, character or field
  -M    from first to M'th (included) byte, character or field
cat input.txt | tr -s ' ' | cut -d ' ' -f1,2
perl -ane 'print "$F[0] $F[1]\n"' file