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

Posted

技术标签:

【中文标题】如何将第三列打印到最后一列?【英文标题】:How to print third column to last column? 【发布时间】:2010-12-08 18:59:46 【问题描述】:

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

【问题讨论】:

Using awk to print all columns from the nth to the last的可能重复 【参考方案1】:
awk 'for(i=3;i<=NF;++i)print $i' 

【讨论】:

awk 'for(i=3;i 谢谢,lh3。我只是在复制和粘贴 gawk 手册。 :) 这会因多行而失败,打印时每列都被视为新行 为了解决拆分输出的问题,我提出了这个解决方案:awk 'for(i=3;i&lt;=NF;++i)printf $i""FS ; print ""'printf不会打印换行符,而print ""会在打印完其他字段后添加换行符)跨度> 或:echo $(seq 1 10) | awk 'for (i=3; i&lt;=NF; i++) printf $i FS',即:3 4 5 6 7 8 9 10【参考方案2】:

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

【讨论】:

请注意,这仅在所有列之间的分隔符完全相同时才有效...例如,您不能将 cut 与 \d+ 之类的分隔符一起使用。 (据我所知。) 当问题标题为 awk 时,不适合接受 awk 以外的答案。如果人们需要 awk 脚本怎么办?这个答案应该只是一个评论。 @SyaZ:通常我会同意,但考虑到这个板上的“免费 awk”数量,我认为需要展示另一种完成任务的方式。如果有人向您展示了一种更简单快捷的方法来完成相同的任务,您会不会感激不尽?也许发布者认为 awk 是这样做的唯一方法,因为对其他问题的回答有很多“不正确,但肯定可以改进”? 这就是评论的目的。接受最佳 awk 答案,并在 cmets 上提供更好的非 awk 建议。如果人们开始发布不完全回答问题的答案,搜索时会很烦人(在我的情况下)。 不仅所有列之间的分隔符必须相同,而且列之间必须有一个分隔符。因此,如果您正在处理将其输出与分隔符对齐的程序,最好使用 awk。【参考方案3】:
awk ' print substr($0, index($0,$3)) '

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

【讨论】:

我有点晚了,但这不适用于第一个或第二个字段等于第三个字段的记录(例如,3 2 3 4 5) 也可以打印内部范围:``` # from $3 (included) to $6 (excluded);回声“1,2,3,4,5,6,7,8,9” | awk 'BEGINFS=",";OFS="," print substr($0, index($0,$3), length($0)-index($0,$6)-1) '; # 给出 3,4,5```【参考方案4】:

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

awk 'for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print' logfile

【讨论】:

请注意,这仅适用于 Gnu awk,POSIX 不允许减少 NF @kvantour:它适用于 gawk、mawk、MacOS awk(nawk?)。 POSIX 似乎对是否可以减少 NF 保持沉默。 这是其中一个有趣的dark corners of awk。【参考方案5】:
awk '$1=$2=$3=""1' file

注意:此方法会在 1、2、3 字段中留下“空白”,但如果您只想查看输出,这不是问题。

【讨论】:

使用 ` | 跟踪该命令sed s/^\ *// | column -t` 去除前导空格并对齐剩余的列 最后一个1 是什么意思?我应该用awk搜索哪个关键字? @Itachi 查看catonmat.net/blog/awk-one-liners-explained-part-one的示例1 @Nathan 你用$1=$2=$3="";$0=$0;$1=$11解决了这个问题 这对于清除中间的一些不必要的列非常有用(同时仍然抓到最后)!谢谢@ghostdog74【参考方案6】:

如果您想打印第三列之后的列,例如在同一行中,您可以使用:

awk 'for(i=3; i<=NF; ++i) printf "%s ", $i; print ""'

例如:

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

它将打印:

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

我们可以看到,即使有空格,工资单也会显示在正确的行中。

【讨论】:

这很好,但我遇到了 $NF 被排除在外的问题。当我设置条件( 看来我的问题是 ^M 卡在最后一列的末尾。不知道如何删除它。【参考方案7】:

下面这行呢:

awk '$1=$2=$3="";打印'文件

基于@ghostdog74 的建议。当您过滤行时,我的表现应该更好,即:

awk '/^exim4-config/ $1="";打印'文件

【讨论】:

简短而简单。也可以在命令末尾添加sed 's/\s\+//g' 以修剪前导空格【参考方案8】:
awk -v m="\x0a" -v N="3" '$N=m$N ;print substr($0, index($0,m)+1)'

这会删除给定字段 nr.、N 之前的内容,并打印该行的所有其余部分,包括字段 nr.N 并保持原始间距(它不会重新格式化)。字段的字符串是否也出现在该行的其他位置无关紧要,这是daisaa的答案的问题。

定义一个函数:

fromField ()  
awk -v m="\x0a" -v N="$1" '$N=m$N; print substr($0,index($0,m)+1)'

并像这样使用它:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

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

适用于以“/n”作为记录分隔符的文件,因此行内没有换行符。如果您想将它与其他记录分隔符一起使用,请使用:

awk -v m="\x01" -v N="3" '$N=m$N ;print substr($0, index($0,m)+1)'

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

【讨论】:

【参考方案9】:
awk 'a=match($0, $3); print substr($0,a)'

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

【讨论】:

【参考方案10】:

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

awk 'for( i=6; i<=NF; i++ )printf( "%s ", $i ); printf( "\n"); '

在下面找到一个示例,它列出了 /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

【讨论】:

【参考方案11】:

嗯,您可以使用正则表达式轻松实现相同的效果。假设分隔符是一个空格,它看起来像:

awk ' sub(/[^ ]+ +[^ ]+ +/, ""); print '

【讨论】:

我会避免使用正则表达式。不小心搞砸可能会更慢更容易。 它像这样缩短它:awk ' sub(/([^ ]+ +)2/, ""); print ' 将模式带走两次。【参考方案12】:
awk 'print ""for(i=3;i<=NF;++i)printf $i" "'

【讨论】:

【参考方案13】:

Perl 解决方案:

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 数组的元素,在每个元素之间使用空格

如果您的输入文件是逗号分隔而不是空格分隔,请使用-F, -lane


Python 解决方案:

python -c "import sys;[sys.stdout.write(' '.join(line.split()[2:]) + '\n') for line in sys.stdin]" &lt; file

【讨论】:

【参考方案14】:

这里有点晚了,但上述方法似乎都不起作用。试试这个,使用 printf,在每个之间插入空格。我选择最后没有换行符。

awk 'for(i=3;i<=NF;++i) printf("%s ",  $i) '

【讨论】:

【参考方案15】:
awk 'for (i=4; i<=NF; i++)printf("%c", $i); printf("\n");'

以与原始文件中相同的顺序打印从第 4 个字段到最后一个字段的记录

【讨论】:

对不起,这不是很正确的答案。太具体了,不知道怎么删【参考方案16】:

在 Bash 中,您可以使用以下带有位置参数的语法:

while read -a cols; do echo $cols[@]:2; done < file.txt

了解更多信息:Handling positional parameters Bash Hackers Wiki

【讨论】:

【参考方案17】:

如果只是忽略前两个字段,并且在屏蔽这些字段时不想要空格(就像上面的一些答案一样):

awk 'gsub($1" "$2" ",""); print;' file

【讨论】:

【参考方案18】:
awk '$1=$2=""1' FILENAME | sed 's/\s\+//g'

前两列被清除,sed 删除前导空格。

【讨论】:

【参考方案19】:

在 AWK 中,列称为字段,因此 NF 是关键

所有行:

awk -F '<column separator>' 'print $(NF-2)' <filename>

仅第一行:

awk -F '<column separator>' 'NR<=1print $(NF-2)' <filename>

【讨论】:

以上是关于如何将第三列打印到最后一列?的主要内容,如果未能解决你的问题,请参考以下文章

第三列单元格应该是excel第一列和第二列中两个数字的乘积

Cocoa - 绑定 - Tableview - 如何计算列的总和

Pandas 根据非恒定值的第三列将值从一列复制到另一列

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

将数据框的第三列放在下一行

如何将excel中的三列数值转换成一列日期