在awk中打​​印其余字段

时间:2013-08-27 05:17:37

标签: bash awk

假设我们有这个数据文件。

john 32 maketing executive
jack 41 chief technical officer
jim  27 developer
dela 33 assistant risk management officer

我想使用awk

进行打印
john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

我知道可以使用for完成。

awk '{printf $1;  for(i=3;i<NF;i++){printf " %s", $i} printf "\n"}' < file

问题是它很长而且看起来很复杂。

是否还有其他简短方法可以打印其他字段

7 个答案:

答案 0 :(得分:43)

将要跳过的字段设置为空白:

awk '{$2 = ""; print $0;}' < file_name

来源:Using awk to print all columns from the nth to the last

答案 1 :(得分:8)

使用默认FS时,可靠地使用GNU awk for gensub():

$ gawk -v delNr=2 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer

对于其他awks,您需要使用match()和substr()而不是gensub()。请注意,上面的变量delNr告诉awk您要删除哪个字段:

$ gawk -v delNr=3 '{$0=gensub("^([[:space:]]*([^[:space:]]+[[:space:]]+){"delNr-1"})[^[:space:]]+[[:space:]]*","\\1","")}1' file
john 32 executive
jack 41 technical officer
jim  27
dela 33 risk management officer

不要这样做:

awk '{sub($2 OFS, "")}1'

因为$ 2中的同一文本可能在$ 1的末尾,而/或$ 2可能包含RE元字符,所以很有可能你会以这种方式删除错误的字符串。

不要这样做:

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

因为它添加了一个FS,并且会将字段之间的所有其他连续空白区域压缩为一个空白字符。

不要这样做:

awk '{$2="";sub("  "," ")}1' file

因为它有上面提到的空间压缩问题并且依赖于单个空白的硬编码FS(默认情况下,所以可能不是那么糟糕)但更重要的是如果在$ 1之前有空格它会删除其中一个那些而不是它在1美元到2美元之间的空间。

最后一件值得一提的是,在最新版本的gawk中有一个名为patsplit()的新函数,它的工作方式类似于split()但除了创建字段数组外,它还创建了一个空间数组。田野。这意味着您可以在数组中操作字段和之间的空格,这样您就不必担心如果操作字段,使用OFS重新编译记录。然后你只需要从数组中打印你想要的字段。有关详细信息,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#String-Functions中的patsplit()。

答案 2 :(得分:5)

您可以像这样使用简单的awk:

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

然而,这将在你的输出中有一个额外的OFS,这可以通过这个awk来避免

awk '{sub($2 OFS, "")}1' file

或者使用此tr和cut组合:

在Linux上:

tr -s ' ' < file | cut -d ' ' -f1,f3-

在OSX上:

tr -s ' ' < file | cut -d ' ' -f1 -f3-

答案 3 :(得分:4)

这将删除#2字段并清理额外空间。

awk '{$2="";sub("  "," ")}1' file

答案 4 :(得分:3)

另一种方法是使用sed替换第一个数字和空格匹配:

sed 's|[0-9]\+\s\+||' file

答案 5 :(得分:0)

使用不需要awk或任何状态突变的gawk方法:

awk '{print $1 " " substr($0, index($0, $3));}' datafile

UPD

更长的解决方案,但是当$ 1或$ 2包含$ 3时,这种情况会站起来:

awk '{print $1 " " substr($0, length($1 $2) + 1);}' data

如果您具有自定义字段分隔符,则更加强大:

awk '{print $1 " " substr($0, length($1 FS $2 FS) + 1);}' data

答案 6 :(得分:-1)

不要使用修改 $n。如果您想保留的某些部分有更多空间,则会减少到一个。