我有以下文件,需要用 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
...
好的,根据你的数据,cut命令应该就足够了:
cut -d\ -f3- infile
虽然与yael预期输出相比,它在每行开头添加了一个额外的空格,但这里是一个比之前建议的更短、更简单的基于awk的解决方案:
awk '{$1=$2=""; print}'
或者甚至:
awk '{$1=$2=""}1'
awk '{$1=$2="";$0=$0;$1=$1}1' file
。 - user000001$ 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
danben的答案在结果字符串末尾留下了一个空格。因此,正确的方法应该是:
awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' filename
awk -F 'INFORMATION DATA ' '{print $2}' t
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
字段分隔符选项
awk
的解决方案,比 cut
更灵活,比其他 awk
解决方案更短。假设您的分隔符是单个空格(如果不是,请根据需要修改正则表达式):awk --posix '{sub(/([^ ]* ){2}/, ""); print}'