如何将第三列打印到最后一列?

Ami*_*t G 108 unix linux shell multiple-columns

我正在尝试从DbgView日志文件中删除前两列(我不感兴趣).我似乎无法找到从第3列开始直到行结束的示例.请注意,每一行都有可变数量的列.

Jon*_*erg 102

awk '{for(i=3;i<=NF;++i)print $i}' 
Run Code Online (Sandbox Code Playgroud)

  • 这会因多行而失败,每次打印时,每列都会作为新行进行处理 (20认同)
  • 为了解决分裂输出问题,我提出了这个解决方案:`awk'{for(i = 3; i <= NF; ++ i)printf $ i""FS; print""}'`(`printf`将不打印换行符,而'print'"`将在打印其他字段后添加换行符) (11认同)
  • awk'{for(i = 3; i <= NF; ++ i)print $ i}'更紧凑.:) (3认同)
  • 这里的关键点是NF的存在和意义. (3认同)
  • 或者:`echo $(seq 1 10) | awk '{for (i=3; i&lt;=NF; i++) printf $i FS}'`,给出:“3 4 5 6 7 8 9 10”。 (2认同)

Mar*_*cin 102

...或更简单的解决方案:cut -f 3- INPUTFILE 只需添加正确的分隔符(-d)即可获得相同的效果.

  • 当问题标题为awk时,除了awk之外接受答案是不合适的.如果人们需要awk脚本怎么办?这个答案应该只是一个评论. (69认同)
  • @SyaZ:通常我都同意,但是随着"无偿的awk"在这个板上的数量,我认为需要显示另一种完成任务的方式.如果有人向您展示更简单快捷的方法来执行相同的任务,您会感激不尽吗?也许海报认为awk是唯一的方法,因为其他问题的答案"不正确,但肯定可以改进"? (22认同)
  • 这就是评论的意思.接受最好的awk答案,并在评论中提供更好的非awk建议.如果人们开始发布不能完全回答问题的答案,那么在搜索时(在我的情况下)会很烦人. (12认同)
  • 不仅所有列之间的分隔符必须相同,而且列之间必须有一个完全一个分隔符.因此,如果您正在处理将其输出与分隔符对齐的程序,则最好使用awk. (11认同)
  • 请注意,这仅适用于所有列之间的分隔符完全相同的情况...例如,您不能使用带有\ d +等分隔符的cut.(我知道.) (8认同)
  • 3本身是打印字段编号3. 3-是打印字段3和其后的所有字段. (2认同)
  • @ZachWily,@ sknaumov,用于缓解这个\ s +分隔符问题的Unix方法是通过`tr -s'[:blank:]'''`事先进行管道[[source](http://lists.gnu.org//存档/ HTML /臭虫的coreutils/2009-09/msg00165.html). (2认同)

小智 96

awk '{ print substr($0, index($0,$3)) }'
Run Code Online (Sandbox Code Playgroud)

解决方案在这里找到:http:
//www.linuxquestions.org/questions/linux-newbie-8/awk-print-field-to-end-and-character-count-179078/

  • 我对此迟到了,但这不适用于第一个或第二个字段等于第三个字段的记录(例如,3 2 3 4 5) (19认同)

Pau*_*ce. 32

Jonathan Feinberg的回答将每个字段打印在一个单独的行上.您可以使用printf在同一行重建输出记录,但您也可以将字段向左移动.

awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}' logfile
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这只适用于 Gnu awk,POSIX 不允许递减 `NF`。 (2认同)
  • @kvantour:它适用于 gawk、mawk、MacOS awk(nawk?)。POSIX 似乎对“NF”是否可以递减保持沉默。 (2认同)

gho*_*g74 16

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

注意:这个方法会在1,2,3个字段中留下"空白",但如果您只想查看输出则不会出现问题.

  • 最后一个“1”是什么意思?我应该使用“awk”搜索哪个关键字? (2认同)
  • @Nathan 你把这个问题解决为 `{$1=$2=$3="";$0=$0;$1=$1}1` (2认同)

Rob*_*ila 8

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Run Code Online (Sandbox Code Playgroud)

这会在给定的字段n,N之前切断,并打印该行的所有其余部分,包括字段nr.N并保持原始间距(它不重新格式化).如果字段的字符串也出现在该行的其他位置,则不会产生影响,这是daisaa答案的问题.

定义一个功能:

fromField () { 
awk -v m="\x0a" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 
Run Code Online (Sandbox Code Playgroud)

输出维护所有内容,包括尾随空格

适用于'/ n'是记录分隔符的文件,因此行内没有新行字符.如果要将其与其他记录分隔符一起使用,请使用:

awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Run Code Online (Sandbox Code Playgroud)

例如.适用于几乎所有文件,只要它们不使用十六进制字符.1行内.


Bro*_*her 8

如果要在第3行之后打印列,例如在同一行中,可以使用:

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

例如:

Mar 09:39 20180301_123131.jpg
Mar 13:28 20180301_124304.jpg
Mar 13:35 20180301_124358.jpg
Feb 09:45 Cisco_WebEx_Add-On.dmg
Feb 12:49 Docker.dmg
Feb 09:04 Grammarly.dmg
Feb 09:20 Payslip 10459 %2828-02-2018%29.pdf
Run Code Online (Sandbox Code Playgroud)

它将打印:

20180301_123131.jpg
20180301_124304.jpg
20180301_124358.jpg
Cisco_WebEx_Add-On.dmg
Docker.dmg
Grammarly.dmg
Payslip 10459 %2828-02-2018%29.pdf
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,即使有空间,工资单显示在正确的行中.


小智 7

awk '{a=match($0, $3); print substr($0,a)}'
Run Code Online (Sandbox Code Playgroud)

首先找到第三列的开始位置。使用 substr,您将打印从位置(在本例中为 a)到行尾的整行($0)。


Waw*_*zek 5

以下行如何:

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

基于@ ghostdog74建议.当你过滤线时,我的表现会更好,即:

awk '/^exim4-config/ {$1=""; print }' file

  • 此命令在每行的开头放置一个空格. (3认同)

fun*_*unk 5

以下 awk 命令打印每行的最后 N 个字段,并在行末尾打印一个新行字符:

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

下面的示例列出了 /usr/bin 目录的内容,然后保存最后 3 行,然后使用 awk 打印每行的最后 4 列:

$ ls -ltr /usr/bin/ | tail -3
-rwxr-xr-x 1 root root       14736 Jan 14  2014 bcomps
-rwxr-xr-x 1 root root       10480 Jan 14  2014 acyclic
-rwxr-xr-x 1 root root    35868448 May 22  2014 skype

$ ls -ltr /usr/bin/ | tail -3 | awk '{for( i=6; i<=NF; i++ ){printf( "%s ", $i )}; printf( "\n"); }'
Jan 14 2014 bcomps 
Jan 14 2014 acyclic 
May 22 2014 skype
Run Code Online (Sandbox Code Playgroud)