awk + 需要打印除$1和$2以外的所有字段

15

我有以下文件,需要用 awk 打印除了 $1$2 以外的所有内容。

文件:

INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22
...

期望的输出结果:

 12 33 55 33 66 43 
 45 76 44 66 77 33 
 77 83 56 77 88 22
...

可能是重复的问题:使用awk打印从第n列到最后一列的所有列 - Andy
7个回答

22

好的,根据你的数据,cut命令应该就足够了:

cut -d\  -f3- infile

12

虽然与yael预期输出相比,它在每行开头添加了一个额外的空格,但这里是一个比之前建议的更短、更简单的基于awk的解决方案:

awk '{$1=$2=""; print}'

或者甚至:

awk '{$1=$2=""}1'

2
如果你想避免前导空格,可以使用 awk '{$1=$2="";$0=$0;$1=$1}1' file - user000001

11
$ cat t
INFORMATION DATA 12 33 55 33 66 43
INFORMATION DATA 45 76 44 66 77 33
INFORMATION DATA 77 83 56 77 88 22

$ awk '{for (i = 3; i <= NF; i++) printf $i " "; print ""}' t 
12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 

2
即使对于当前的问题有比awk更简单的解决方案(请参见下文),如果您需要对数据进行某些计算,则了解循环非常有用!我的一个同事不得不在前两列上执行加法,然后按原样打印其他列:一个简单的printf块跟随您的块完成了任务。感谢您的答案(我点了加号 :-))。 - Christophe Muller

3

danben的答案在结果字符串末尾留下了一个空格。因此,正确的方法应该是:

awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' filename

1
awk '{for (i=3; i<NF; i++) printf $i " "; print $i}' filename得到的结果与原命令相同。您知道为什么吗? - jaypal singh

2
如果前两个单词不变,可能最简单的方法是:
awk -F 'INFORMATION DATA ' '{print $2}' t

0
如果Perl是一个选项:
perl -lane 'splice @F,0,2; print join " ",@F' file

以下是使用的命令行选项:
-n 循环遍历输入文件的每一行,不自动打印
-l 在处理之前删除换行符,并在处理后添加回来
-a 自动分割模式 - 将输入行分割成 @F 数组。默认情况下按空格分割
-e 执行 Perl 代码

splice @F,0,2@F 数组中干净地删除第 0 和第 1 列
join " ",@F 使用空格将 @F 数组的元素连接起来,每个元素之间用一个空格隔开

csv 输入文件的变化:

perl -F, -lane 'splice @F,0,2; print join " ",@F' file

这里使用了带有逗号的-F字段分隔符选项


0
这是另一种使用 awk 的解决方案,比 cut 更灵活,比其他 awk 解决方案更短。假设您的分隔符是单个空格(如果不是,请根据需要修改正则表达式):
awk --posix '{sub(/([^ ]* ){2}/, ""); print}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接