awk +需要打印除1美元和2美元之外的所有内容(所有其他字段)

时间:2010-06-15 14:48:31

标签: awk filtering

我有以下文件,我需要按$1

打印$2awk以外的所有内容

文件:

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
...

7 个答案:

答案 0 :(得分:18)

好吧,根据您的数据,切割应该足够了:

cut -d\  -f3- infile

答案 1 :(得分: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 :(得分:10)

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

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

甚至:

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

答案 3 :(得分:3)

danbens answer在结果字符串的末尾留下一个空格。所以正确的方法是:

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

答案 4 :(得分:2)

如果前两个单词没有改变,最简单的可能是:

awk -F 'INFORMATION DATA ' '{print $2}' t

答案 5 :(得分:0)

这是另一个awk解决方案,它比cut解决方案更灵活,并且比其他awk解决方案更短。假设您的分隔符是单个空格(如果不是,则根据需要修改正则表达式):

awk --posix '{sub(/([^ ]* ){2}/, ""); print}'

答案 6 :(得分:0)

如果Perl是一个选项:

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

使用这些命令行选项:
-n循环输入文件的每一行,不要自动打印它 -l在处理之前删除换行符,然后将其添加回来 -a autosplit模式 - 将输入行拆分为@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字段分隔符选项和逗号