在awk中打​​印其余字段

Shi*_*dim 27 bash awk

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

john 32 maketing executive
jack 41 chief technical officer
jim  27 developer
dela 33 assistant risk management officer
Run Code Online (Sandbox Code Playgroud)

我想打印使用 awk

john maketing executive
jack chief technical officer
jim  developer
dela assistant risk management officer
Run Code Online (Sandbox Code Playgroud)

我知道可以用它来完成for.

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

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

是否有其他简短的方法来打印其余的字段.

Bar*_*run 50

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

awk '{$2 = ""; print $0;}' < file_name
Run Code Online (Sandbox Code Playgroud)

来源:使用awk打印从第n个到最后一个的所有列

  • 不清理额外的空间,并使用不需要的'print $ 0`,可以用简单的`1`代替 (4认同)
  • @Alex 删除“print $0”并将“1”放在结束“}”后面。 (2认同)

Ed *_*ton 9

使用默认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
Run Code Online (Sandbox Code Playgroud)

对于其他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
Run Code Online (Sandbox Code Playgroud)

不要这样做:

awk '{sub($2 OFS, "")}1'
Run Code Online (Sandbox Code Playgroud)

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

不要这样做:

awk '{$2=""}1' file
Run Code Online (Sandbox Code Playgroud)

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

不要这样做:

awk '{$2="";sub("  "," ")}1' file
Run Code Online (Sandbox Code Playgroud)

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

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

  • 看着这些复杂性,有人想知道awk是否确实是完成这项工作的最佳工具。例如,如果字段由竖线或逗号分隔,则需要重写整个awk代码。 (2认同)

anu*_*ava 5

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

awk '{$2=""}1' file
Run Code Online (Sandbox Code Playgroud)

但是,这会在您的输出中产生额外的OFS,因此可以避免这种情况

awk '{sub($2 OFS, "")}1' file
Run Code Online (Sandbox Code Playgroud)

或者通过使用此tr和cut组合:

在Linux上:

tr -s ' ' < file | cut -d ' ' -f1,f3-
Run Code Online (Sandbox Code Playgroud)

在OSX上:

tr -s ' ' < file | cut -d ' ' -f1 -f3-
Run Code Online (Sandbox Code Playgroud)

  • @anubhava-不,唯一要查找字符串而不是另一个字符串中RE的awk函数是index()。 (2认同)