50

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

123   abc  22.3
453   abg  56.7
1236  hjg  2.3

期望的输出

123  abc
453  abg
1236 hjg 
4

7 回答 7

67

试试这个简短的东西:

awk '!($3="")' file
于 2013-03-12T13:00:10.407 回答
41

使用 GNU awk 进行就地编辑、\s/\Sgensub()删除

1)第一个字段:

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

或者

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

2)最后一个字段:

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

或者

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

3) N=3的第N字段:

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

如果没有 GNU awk,您需要一个match()+substr()组合或多个sub()s + var 来删除中间字段。另请参阅打印除前三列之外的所有列

于 2016-07-01T12:24:32.390 回答
26

这可能对您有用(GNU sed):

sed -i -r 's/\S+//3' file

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

sed -i -r 's/(\s+)?\S+//3' file
于 2013-03-12T12:55:22.090 回答
18

看来你可以简单地去

awk '{print $1 " " $2}' file

这将打印输入文件中每行的前两个字段,用空格分隔。

于 2013-03-12T12:51:00.187 回答
11

尝试使用 cut... 它又快又简单

首先你有重复的空格,如果你想要的话,你可以将它们压缩到列之间的单个空格tr -s ' '

如果每一列之间已经只有一个分隔符,您可以使用cut -d ' ' -f-2打印字段(列)<= 2。

例如,如果您的数据在文件 input.txt 中,您可以执行以下操作之一:

cat input.txt | tr -s ' ' | cut -d ' ' -f-2

或者,如果您通过删除第三列来更好地解释这个问题,您可以编写以下内容

cat input.txt | tr -s ' ' | cut -d ' ' --complement -f3

cut 非常强大,除了列之外,您还可以提取字节或字符范围

摘自有关如何指定列表范围的语法的手册页

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

所以你也可以说你想要特定的第 1 列和第 2 列...

cat input.txt | tr -s ' ' | cut -d ' ' -f1,2
于 2017-08-31T14:55:27.963 回答
8

尝试这个 :

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

或者

awk '{$3="";print}' file.txt > new_file && mv new_file file.txt
于 2013-03-12T12:56:02.447 回答
0

如果您愿意接受 Perl 解决方案...

perl -ane 'print "$F[0] $F[1]\n"' file

使用这些命令行选项:

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

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

  • -e执行以下 perl 代码

于 2020-09-11T19:48:31.747 回答